我可以像这里一样有专门的模板吗?
Can I have specialized template like here?
我想要通用的 class 具有模板类型的任意维度的向量
template <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]; }
};
gcc 为您的代码打印非常简单的错误:
error: template parameters not deducible in partial specialization: D
为了设置部分专业化,您应该删除参数 D:
template <typename T> // <=== No *unsigned D* here
class Vector<T, 3> {
public:
// implementation here
};
然后实施专业化。
当然,您可以以任何方式部分特化您的模板 class。您犯的唯一语法错误是,您应该列出实际上是参数(而不是常量)的模板参数。
#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
。
你可以在专业领域内做任何你想做的事情。它可以有一个完全不同的 body.
我想要通用的 class 具有模板类型的任意维度的向量
template <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]; }
};
gcc 为您的代码打印非常简单的错误:
error: template parameters not deducible in partial specialization: D
为了设置部分专业化,您应该删除参数 D:
template <typename T> // <=== No *unsigned D* here
class Vector<T, 3> {
public:
// implementation here
};
然后实施专业化。
当然,您可以以任何方式部分特化您的模板 class。您犯的唯一语法错误是,您应该列出实际上是参数(而不是常量)的模板参数。
#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
。
你可以在专业领域内做任何你想做的事情。它可以有一个完全不同的 body.