我有以下代码:
void myfunc()
{
}
template <typename T>
void check()
{
}
template <typename T>
void checkT (T)
{
check<T>();
} 因此,如果我在主函数中调用了checkT(myfunc),那么它就编译了,但是如果我有check<myfunc>(),虽然它直接调用了第一个版本,但是它不能工作。你能解释一下为什么会这样吗?错误是
错误:调用“check()”没有匹配函数
谢谢!
发布于 2013-03-18 01:40:14
这是因为myfunc是一个值表达式,而不是类型。你可以
check<decltype(myfunc)>();尽管,或相当于:
check<void(void)>();在http://liveworkspace.org/code/2ANEre$0上直播
PS.在回复评论时,我感觉到函数形式参数和模板类型参数之间有点混淆。写得更清楚些:
template <typename T>
void checkT (T somevalue)
{
check<T>(); // note: somevalue is never used!
} 发布于 2013-03-18 01:42:15
在第一个例子中,checkT(myfunc)能够推断出类型,checkT与checkT( T value )是完全相同的,因此您正在传递value,并且正在推导T。在第二种情况下,您没有提供一个类型,您可以这样修改它来工作:
check<decltype(myfunc)>() ;您实际上提供了一个value,在这里您需要一个type --在本例中是void(void)。
发布于 2013-03-18 01:45:59
checkT(myfunc)之所以有效,是因为myfunc是一个值。但是第二种方法失败了,因为它不是模板参数所需的类型。例如,
void checkT(T) 是相同的
void checkT(T t)这意味着传递的函数是一个T类型的对象。也就是说,t是对象,T是类型。在check的模板参数中,它需要明确的类型规范,而不是对象。因此,传入一个对象将引发编译错误。就像传递数字5一样,需要显式类型的int。
您可以通过将它包装在decltype表达式中,将其作为类型使用:
check<decltype(myfunc)>();
// ^^^^^^^^^^^^^^^^https://stackoverflow.com/questions/15468517
复制相似问题