模板参数推导错误

时间:2010-10-02 16:51:54

标签: c++ templates

template <typename T>
void foo(int i)
{
  //nothing inside
}

int main()
{
   foo(5); //fails
   foo<int>(5); //works
}

为什么foo(5)失败但是foo&lt; int&gt;(5)工作?

5 个答案:

答案 0 :(得分:4)

您可能想写

template <typename T>
void foo(T i)          // note the type of i
{
  //nothing inside
}

<强>更新

以下是完整的代码

#include <iostream>
using std::cout;

template <typename T>
void foo( T i ) {
    cout << __PRETTY_FUNCTION__ << " called with " << i << "\n";
}

int main() {
    foo( 5 );
    foo<int>( 7 );
}

并输出:

void foo(T) [with T = int] called with 5
void foo(T) [with T = int] called with 7

答案 1 :(得分:3)

编译器不知道什么是T。

答案 2 :(得分:0)

如果将函数定义为模板函数,则需要定义要使用的类型(即使函数不使用模板类型)

所以你需要告诉编译器T是什么类型。

答案 3 :(得分:0)

  

为什么foo(5)失败但是foo&lt; int&gt;(5)工作?

因为编译器无法确定[来自T]的foo(5)是什么。

您只能保留结尾的模板参数,而不是开头或中间:

例如:

template<typename T, typename U> 
void foo(T t) 
{
}
template<typename T, typename U> 
void bar(U u) 
{
}

int main() 
{
    foo<int>(5);      // Error!! Compiler cannot decide what `U` is
    foo<int, int>(5); // Works!!

    bar<int>(5);      // Works!! `U` deduced from `5` (int)
    bar<int, int>(5); // Works!!
}

答案 4 :(得分:0)

通常你会有这样的事情:

template <class T>
void foo(T i) { }

然后,当您传递int作为参数时,编译器可以推断出T必须是int。由于您的代码在任何地方都没有使用T,因此编译器无需继续推断它可能是什么。