【问题标题】:Templates: Using partial templates gives wrong number of arguments error模板:使用部分模板会给出错误数量的参数错误
【发布时间】:2014-04-04 21:08:41
【问题描述】:

我这样声明两个类:

template<typename Data, const int m, const int n>
class Foo {};

template<typename Data, const int m>
class Foo <Data, m, 1> {};

现在,当我尝试以下操作时(几乎是 double 类,但它的行为与其他任何东西一样,因此新的部分类将是一种矫枉过正):

template <const int n>
using BarD = Foo<double, n>; // error: wrong number of template arguments (2, should be 3)

为什么会这样?有没有我没完全理解的概念?

PS:我使用 eclipse 4.3.1 M20130911-1000 并使用 g++ -O3 -g -Wall -c -std=c++11 -o obj/c++/src/test.o src/test.cpp 构建

【问题讨论】:

  • 您将专业化与默认模板参数混淆了。而且您的代码中没有Mat 模板。

标签: templates c++11 compiler-errors


【解决方案1】:

对于给定的template,特化不会扩展接口——template 采用的参数的种类和数量。

专业化不像重载。相反,它是对原始 template 指定的参数的模式匹配。

特化的template 参数从不直接由客户端代码传递,而是通过它们的使用方式推断出模式匹配。

所以

template<typename Data, int m> class Foo <Data, m, 1> {};

template<int m, typename Data> class Foo <Data, m, 1> {};

是相同的专业,即使我更改了mData 的顺序。 (大部分)重要的顺序是在Foo 之后,其中使用原始 template 参数的顺序,并且任何来自专业化的template 参数都放置在模式匹配的目的。

如果模式匹配,则应用特化(如果多个特化匹配,则遵循更多规则)。

【讨论】:

    【解决方案2】:

    您需要在主声明中使用默认参数:

    template<typename Data, int m, int n = 1>
    class Foo {};
    
    template<typename Data, int m>
    class Foo <Data, m, 1> {};
    

    另外,模板声明中不需要const int,只需int

    【讨论】:

    • 谢谢。你能扩大你的答案吗?也许只是为了一个完整的解释性答案,简短地解释一下(2 句话)专业化和默认模板参数之间的区别。
    • 当然。 Foo 是一个模板类,它接受三个参数:一个类型、一个 int 和另一个 int,其中最后一个可以被实例化它的代码省略。将模板专业化视为模式匹配的模板类的实现。专业化不能改变它的“称呼”方式;它只是改变了它的实现方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 2019-06-08
    相关资源
    最近更新 更多