模板特化没有匹配的构造函数
Template specialization no matching constructor
我正在创建一个模板化向量 class,大致按以下方式完成:
// 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>')
.
我看过的所有类似问题都表明构造函数应该自动使用模板化 classes,所以我不确定这里发生了什么。我之前遇到 classes 的构造函数错误,它没有模板专门化,它列出了另一个构造函数不可行,这让我认为构造函数没有被复制到模板化 class 出于某种原因。
部分和显式特化不会从主模板继承任何东西;他们完全无关。在您的代码中,Vector<T, 3>
是一个完全空的 class,除了静态成员函数。
当 partial/explicit 专业化与主模板共享代码时(例如,通过继承实现共享功能的基础 class 模板),有一些方法可以减少代码重复,但在在这种情况下,我认为没有理由首先编写部分专业化。只需将 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);
。
我正在创建一个模板化向量 class,大致按以下方式完成:
// 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>')
.
我看过的所有类似问题都表明构造函数应该自动使用模板化 classes,所以我不确定这里发生了什么。我之前遇到 classes 的构造函数错误,它没有模板专门化,它列出了另一个构造函数不可行,这让我认为构造函数没有被复制到模板化 class 出于某种原因。
部分和显式特化不会从主模板继承任何东西;他们完全无关。在您的代码中,Vector<T, 3>
是一个完全空的 class,除了静态成员函数。
当 partial/explicit 专业化与主模板共享代码时(例如,通过继承实现共享功能的基础 class 模板),有一些方法可以减少代码重复,但在在这种情况下,我认为没有理由首先编写部分专业化。只需将 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);
。