首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++模板函数

c++模板函数
EN

Stack Overflow用户
提问于 2013-03-18 01:35:54
回答 3查看 99关注 0票数 1

我有以下代码:

代码语言:javascript
复制
void myfunc() 
{ 
} 
template <typename T> 
void check() 
{ 
} 

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

因此,如果我在主函数中调用了checkT(myfunc),那么它就编译了,但是如果我有check<myfunc>(),虽然它直接调用了第一个版本,但是它不能工作。你能解释一下为什么会这样吗?错误是

错误:调用“check()”没有匹配函数

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-18 01:40:14

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

代码语言:javascript
复制
check<decltype(myfunc)>();

尽管,或相当于:

代码语言:javascript
复制
check<void(void)>();

http://liveworkspace.org/code/2ANEre$0上直播

PS.在回复评论时,我感觉到函数形式参数和模板类型参数之间有点混淆。写得更清楚些:

代码语言:javascript
复制
template <typename T> 
void checkT (T somevalue) 
{ 
    check<T>();  // note: somevalue is never used!
} 
票数 3
EN

Stack Overflow用户

发布于 2013-03-18 01:42:15

在第一个例子中,checkT(myfunc)能够推断出类型,checkTcheckT( T value )是完全相同的,因此您正在传递value,并且正在推导T。在第二种情况下,您没有提供一个类型,您可以这样修改它来工作:

代码语言:javascript
复制
check<decltype(myfunc)>() ;

您实际上提供了一个value,在这里您需要一个type --在本例中是void(void)

票数 1
EN

Stack Overflow用户

发布于 2013-03-18 01:45:59

checkT(myfunc)之所以有效,是因为myfunc是一个值。但是第二种方法失败了,因为它不是模板参数所需的类型。例如,

代码语言:javascript
复制
void checkT(T) 

是相同的

代码语言:javascript
复制
void checkT(T t)

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

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

代码语言:javascript
复制
check<decltype(myfunc)>();
//    ^^^^^^^^^^^^^^^^
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15468517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档