我想要具有模板类型
的任何维度的通用类Vectortemplate <typename T, unsigned D>
class Vector {
public:
// constructors, methods and so on
protected:
T data[D];
};
以及2,3和4维的专业化
template <typename T, unsigned D>
class Vector<T, 3> {
public:
T getX() const { return data[0]; }
// ...
};
这段代码当然不起作用。我该怎么办?如果有可能。或者,在任何情况下,我都应该使用继承?
template <typename T>
class Vector3 : public Vector<T, 3> {
public:
T getX() const { return data[0]; }
};
答案 0 :(得分:2)
gcc 为您的代码打印非常简单的错误:
错误:模板参数在部分特化中无法推导:D
要设置部分特化,您应删除参数 D :
template <typename T> // <=== No *unsigned D* here
class Vector<T, 3> {
public:
// implementation here
};
然后实现专业化。
答案 1 :(得分:2)
当然,您可以以任何方式部分专门化您的模板类。您所做的唯一语法错误是,您应该列出实际参数(而不是常量)的模板参数。
#include <iostream>
template <typename T, unsigned D>
class Vector {
public:
// constructors, methods and so on
protected:
T data[D];
};
template <typename T>
class Vector<T, 3> {
public:
// the same constructors (or not?)
T getX() const { return data[0]; }
T data[3];
};
int main() {
Vector<int, 3> arr;
arr.data[0]=42;
std::cout << arr.getX();
return 0;
}
请注意,专精Vector<T,3>
不再列出D
。
你可以在专业化中做任何你想做的事。它可以有一个完全不同的身体。