模板专业化没有匹配的构造函数

时间:2015-01-03 06:15:47

标签: c++ templates constructor

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

// 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<float, 3>')

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

1 个答案:

答案 0 :(得分:0)

部分和显式特化不会从主模板继承任何内容;他们是完全无关的。在您的代码中,除了静态成员函数之外,Vector<T, 3>是一个完全空的类。

当部分/显式特化与主模板共享代码时(例如,通过从实现共享功能的基类模板继承),有一些方法可以减少代码重复,但在这种情况下,我认为没有理由写首先是部分专业化。只需将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);