考虑一个简单的函数模板:
template <typename T>
void FunctionTemplate(T t){
}
void MyFunction(){
int a;
FunctionTemplate(a);
FunctionTemplate<int>(a);
}
在第一次调用(FunctionTemplate(a)
)时,编译器计算出引发问题的类型,是否有任何理由存在调用FunctionTemplate(FunctionTemplate<int>(a)
)或任何第二种方法我们无法使用第一种方法的令人信服的理由?
修改:我的术语有点偏差,所以请根据需要进行修改。
答案 0 :(得分:13)
有时你会想要来指定模板参数,即使你不需要。假设您的函数采用T
类型的参数,并且您有int
,但您希望函数将其视为float
。然后你需要明确说出FunctionTemplate<float>(my_int)
。
还有很多情况下无法推断出模板参数。请考虑以下事项:
template <typename T>
T FunctionTemplate() {
return T();
}
无论您如何调用此方法,如果您未提供模板参数,则无法自动推导出T
的类型。在这种情况下,一个简单的原因是调用站点没有说明它希望返回类型是什么。
对于术语:当您未指定模板参数时,隐式实例化模板;当您指定模板参数时,模板将被显式实例化。
答案 1 :(得分:9)
假设您要将该函数作为参数传递给另一个方法;
myAlgorithm( myFunction<int> );
或者假设您要保证函数的浮点版本用于速度;
myFunction<float>( 2.0 );
(忘记写2.0f
现在不是问题)
答案 2 :(得分:7)
用法是强制编译器使用特定版本的模板函数:
template <typename T>
T func(T x, T y)
{
// ...
}
int main()
{
int x = 10;
float y = 20;
func(x, y); //ERROR no matching function for call to 'func(int&, float&)'
func<float>(x, y); // OK, Uses float version of func
}