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)工作?
答案 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
,因此编译器无需继续推断它可能是什么。