我可以在这里使用专门的模板吗?

时间:2017-06-30 20:56:32

标签: c++ templates template-specialization

我想要具有模板类型

的任何维度的通用类Vector
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]; }
};

2 个答案:

答案 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

你可以在专业化中做任何你想做的事。它可以有一个完全不同的身体。