0

我见过这样的代码:

#include <iostream>

// member_function_templates.cpp
struct X
{
   template <class T> void mf(T* t) {
     std::cout << "in mf t is: " << *t << std::endl;
   }
};

int main()
{
   int i = 5;
   X* x = new X();
   x->mf(&i); //why can this be called without specifying a type as in: x->mf<int>(&i) ??
}

我的问题在主要的评论中。为什么可以调用:

x->mf(&i);

...没有指定类型?直觉说它应该被称为:

x->mf<int>(&i);

...但显然不必像这样调用(无论哪种方式,上面都使用 gcc 4.7 编译 - 没有明确指定模板。)

而且,如果您在没有指定模板类型的情况下调用它,那么 T 的类型将是什么(在模板函数定义中)?(我猜它默认为你传递给函数 mf 作为参数的任何类型,但进一步解释它是如何工作的会很好)

4

1 回答 1

3

那是模板类型推导,它适用于所有模板函数,而不仅仅是非模板类的成员。基本上,编译器能够推断(遵循标准中的一组规则)类型T从参数到函数的含义。当编译器看到对 的调用时mf(&i);,它知道那i是 an int,因此参数是 an int*,这意味着您想要具有T==int (*)的重载

如果您想强制模板的特定特化,您仍然可以提供一组特定的模板参数。例如,如果您希望模板的参数不是推导出的参数,而是可以从中转换的参数:

template<typename T>
void foo(T arg) {...}

int i = 10;
foo(i);             // calls foo<int>(i)
foo<double>(i);     // calls foo<double>(static_cast<double>(i))

(*)它比这稍微复杂一些,因为可能有多种T类型的参数是有效的,但是语言中的规则决定了将推导出什么T特定。在这种情况下,它是int

于 2013-02-14T19:16:50.217 回答