我可以像这里一样有专门的模板吗?

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.