首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++中的函数模板,两个问题

C++中的函数模板,两个问题
EN

Stack Overflow用户
提问于 2012-09-08 05:06:23
回答 3查看 106关注 0票数 0

我是C++的初学者,正在使用"C++ Primer Plus“这本书自学这门语言,并对编程变得更加自如。

我在书中做了一些与函数模板主题相关的摘录,我有两个问题。

我不明白为什么下面的显式专门化不起作用:

代码语言:javascript
运行
复制
template <typename T>
T lesser(T a, T b)
{
        return a > b ? a : b;
}


template <> 
box lesser<box>(box& a, box& b)
{
        return a.volume > b.volume? a : b;
}

假设我有一个类型为box的结构,为什么不能将类型专门化为"box&“,而是类型为"box"?第二个声明的意思是“不要使用lesser()模板来生成函数定义,而是使用一个单独的、专门的函数”。而且,我仍然不能使用类型box&,只能使用类型box。为什么会这样呢?

编辑:好的,第二个问题自己消失了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-08 05:14:41

您必须在每个实例中将T指定为相同的类型:

代码语言:javascript
运行
复制
template <>
box& lesser<box&>(box& a, box& b)
{
    // ...
}

或者你可以在任何情况下都使用box

或者,您可以将模板更改为类似以下内容:

代码语言:javascript
运行
复制
template <typename T>
T lesser(const T& a, const T& b)
{
        return a > b ? a : b;
}

并将其专门化为

代码语言:javascript
运行
复制
template <>
box lesser(const box& a, const box& b)
{
        // ...
}
票数 3
EN

Stack Overflow用户

发布于 2012-09-08 05:14:51

模板只有一个参数- T。返回类型和参数类型需要相同。但是您的专门化通过引用获取参数,并通过值返回-这是两种不同的类型,因此模板和专门化不匹配。

票数 3
EN

Stack Overflow用户

发布于 2012-09-08 05:13:49

您的专业化认证与模板不匹配。模板期望一个函数通过值接受两个对象,并返回一个相同类型的对象。您的专门化是一个接受两个盒子对象的函数,引用并返回一个盒子对象。

哦,在它被移除之前,你的第二个例子演示了这一点,因为所有的东西都匹配得很好。回到这一点,并与此进行比较。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12325407

复制
相关文章

相似问题

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