如何定义模板的静态常量变量 class

How to define a static const variable of a template class

我正在尝试制作一个带有向上、向右和向前的预定义静态常量的向量 class,因为它们在所有情况下都应该相同。这应该如何定义,甚至可能吗?

我正在尝试做这样的事情:

template <class T> class vec3
{
public:
    vec3(T x = 0, T y = 0, T z = 0) :
        x(x),
        y(y),
        z(z)
    {
    }

    static const vec3<T> right;
    static const vec3<T> up;
    static const vec3<T> forward;

    T x, y, z;
}

cpp:

#include "vec3.h"

template <typename T>
const vec3<T>::right(1, 0, 0);

template <typename T>
const vec3<T>::up(0, 1, 0);

template <typename T>
const vec3<T>::forward(0, 0, 1);

这会导致语法错误。

template <class T> class vec3
{
public:
    vec3(T x = 0, T y = 0, T z = 0) :
        x(x),
        y(y),
        z(z)
    {
    }

    static const vec3 right;
    static const vec3 up;
    static const vec3 forward;

    T x, y, z;
};


template <typename T>
const vec3<T> vec3<T>::right(1, 0, 0);

template <typename T>
const vec3<T> vec3<T>::up(0, 1, 0);

template <typename T>
const vec3<T> vec3<T>::forward(0, 0, 1);

应该是(全部在header中(如果你想从定义中分离声明,你可以使用.inl或.hxx)):

template <class T> class vec3
{
public:
    vec3(T x = 0, T y = 0, T z = 0) :
        x(x),
        y(y),
        z(z)
    {
    }

    static const vec3 right;
    static const vec3 up;
    static const vec3 forward;

    T x, y, z;
};

template <typename T> const vec3<T> vec3<T>::right(1, 0, 0);
template <typename T> const vec3<T> vec3<T>::up(0, 1, 0);
template <typename T> const vec3<T> vec3<T>::forward(0, 0, 1);

Demo