c++模板函数

c++ template function

本文关键字:函数 c++      更新时间:2023-10-16

我有以下代码:

void myfunc() 
{ 
} 
template <typename T> 
void check() 
{ 
} 
template <typename T> 
void checkT (T) 
{ 
    check<T>(); 
} 

,所以如果我在main函数中调用checkT(myfunc),然后编译,但如果我有check<myfunc>(),不工作,尽管它直接调用第一个版本。你能解释一下为什么会这样吗?错误是

错误:没有匹配的函数调用'check()'

谢谢!

这是因为myfunc是一个值表达式,而不是类型。你可以写

check<decltype(myfunc)>();

,或者:

check<void(void)>();

在http://liveworkspace.org/code/2ANEre$0观看现场直播


p。在回复评论时,我感觉函数形式参数和模板类型参数之间有点混淆。更明确地写:

template <typename T> 
void checkT (T somevalue) 
{ 
    check<T>();  // note: somevalue is never used!
} 

在第一个实例中,checkT(myfunc)能够推断类型,checkT实际上与checkT( T value )相同,因此您正在传递valueT。在第二种情况下,你没有提供一个类型,你可以这样修改它:

check<decltype(myfunc)>() ;

你实际上在需要type的地方提供了value,在这种情况下是void(void)

checkT(myfunc)可以工作,因为myfunc是一个值。但是第二种方法失败了,因为它不是模板参数所要求的类型。例如,

void checkT(T) 

相同
void checkT(T t)

意味着传递的函数是T类型的对象。也就是说,t是对象,T是类型。在check的模板参数中,它需要显式地指定类型,而不是对象。因此,传入一个对象将引发编译错误。就像传递数字5一样,这里需要显式类型int

您可以通过将其包装在decltype表达式中来使用它作为类型:

check<decltype(myfunc)>();
//    ^^^^^^^^^^^^^^^^