【问题标题】:Template specialization no matching constructor模板特化没有匹配的构造函数
【发布时间】:2015-01-03 06:15:46
【问题描述】:

我正在创建一个模板化的矢量类,大致按以下方式完成:

// Main class
template <typename T, int DIMS>
class Vector
{
    // Default constructor
    Vector();
    // Data constructor
    Vector(const T data[DIMS]);

    // Other functions, variables, operators
};

// 3d specialization
template <typename T>
class Vector<T, 3>
{
    // Cross product for 3d vectors -- only thing in specialization
    static Vector<T, 3> cross(const Vector<T, 3> a, const Vector<T, 3> b);
};

对于主模板,我有一个默认构造函数以及一个指定元素的构造函数。当我尝试使用带有元素的构造函数进行编译时,出现错误no matching constructor for initialization of 'Vec3f' (aka 'Vector&lt;float, 3&gt;')。

我看过的所有类似问题都表明构造函数应该自动使用模板类,所以我不确定这里发生了什么。我之前在没有模板特化的类中遇到了构造函数错误,它列出了另一个构造函数不可行,这让我认为构造函数由于某种原因没有被复制到模板类。

【问题讨论】:

  • 您确实需要发布比这更多的代码...无论如何,如果您要的是,主模板中的任何内容都不会复制到部分专业化中。它们完全不相关。
  • 我添加了构造函数代码和专业化的所有内容。如果包含其他内容有帮助,请告诉我。
  • @T.C.这是否意味着我必须将构造函数、函数、运算符等的所有声明和定义从模板复制到专业化?这不是违背模板的目的吗?

标签: c++ templates constructor


【解决方案1】:

部分和显式特化不会从主模板继承任何东西;它们完全不相关。在您的代码中,Vector&lt;T, 3&gt; 是一个完全空的类,除了静态成员函数。

当部分/显式特化与主模板共享代码时,有一些方法可以减少代码重复(例如,通过从实现共享功能的基类模板继承),但在这种情况下,我认为没有理由编写首先是部分专业化。只需将cross 设为免费函数模板即可:

template <typename T, int DIMS>
class Vector
{
    // Default constructor
    Vector();
    // Data constructor
    Vector(const T data[DIMS]);

    // Other functions, variables, operators
};

template<typename T>
Vector<T, 3> cross(const Vector<T, 3> a, const Vector<T, 3> b);

附带说明,Vector(const T data[DIMS]); 可能不会像您认为的那样做 - 它完全等同于 Vector(const T *data);。

【讨论】:

  • 解决了这个问题。我阅读了其他一些问题,似乎模板成员被复制到专业领域。就您的注释而言,我知道这些是等效的;我只是暂时澄清一下应该通过什么。
猜你喜欢
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 2016-12-04
  • 2011-02-09
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多