2013-03-18 128 views
1

我有以下代码:C++模板功能

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

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

所以如果我在主功能checkT(myfunc)那么编译一个电话,但如果我有check<myfunc>()不起作用虽然它直接调用第一版。你能解释一下为什么是这样吗?错误是

error: no matching function for call to 'check()'

谢谢!

+0

为了把事情说清楚,给我们你解释什么是一个例子。 – 0x499602D2 2013-03-18 01:37:16

回答

3

这是因为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! 
} 
+0

谢谢!这工作。但我的问题是,为什么它在我调用'checkT(myfunc)'时调用'check ()'? – 2013-03-18 01:45:08

+0

因为它传递了'T',它是参数的_type_,***不是***的值(作为模板_type_参数) – sehe 2013-03-18 01:46:08

+0

我试图在答案中澄清,似乎是什么来源你的困惑 – sehe 2013-03-18 01:48:49

1

在一审checkT(myfunc)它能够推断出类型,checkT真的等同于checkT(T value)等你传递valueT被推断。在第二种情况下,你不提供,你可以改变它像一个类型,这样的工作:

check<decltype(myfunc)>() ; 

你实际上是提供一个value你需要在这种情况下void(void)一个type

0

checkT(myfunc)因为myfunc是一个值。但是第二个失败,因为它不是模板参数需要的类型。例如,

void checkT(T) 

相同

void checkT(T t) 

这样就意味着传递函数是T类型的对象。也就是说,t是对象,而T是类型。在check的模板参数中,它需要明确指定类型,而不是对象。所以传入一个对象会引发编译错误。就像传递数字5,其中显式类型int预计。

您可以通过在decltype表达其包装使用它作为一个类型:

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