0

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

我在书中做了一些与功能模板主题相关的练习,我有两个问题。

我不明白为什么以下明确的专业化不起作用:

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() 模板来生成函数定义。而是使用单独的专用函数”。而且,我不能使用 type box&,只能使用 box。这是为什么?

编辑:好的,第二个问题本身就消失了。

4

3 回答 3

3

您必须在每个实例中都专注T于相同的类型:

template <>
box& lesser<box&>(box& a, box& b)
{
    // ...
}

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


或者,您可以将模板更改为:

template <typename T>
T lesser(const T& a, const T& b)
{
        return a > b ? a : b;
}

并将其专门化为

template <>
box lesser(const box& a, const box& b)
{
        // ...
}
于 2012-09-07T21:14:40.677 回答
3

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

于 2012-09-07T21:14:50.730 回答
1

您的专长与模板不匹配。模板期望一个函数通过值获取两个对象并返回一个相同类型的对象。您的专业化是一个函数,它采用两个盒子对象引用并返回一个盒子对象。

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

于 2012-09-07T21:13:49.263 回答