2015-12-01 66 views
2

我想用向上,向右和向前的预定义静态常量做一个向量类,因为这些应该在所有情况下都是相同的。这应该如何定义,甚至有可能?如何定义一个模板类的静态常量变量

我试图做这样的事情:

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); 

这将导致一个语法错误。

+1

它应该是'静const vec3 right;'在课堂上。 – Jarod42

+0

顺便说一句,我怀疑你想在.cpp中定义,因为它继续依赖于'T'。 – Jarod42

+0

@ Jarod42它将如何在标题中定义?如果我尝试使用'= vec3(1,0,0);''vec3 :: right':带类内初始值设定项的静态数据成员必须具有非易失性const整型类型' – Duckdoom5

回答

6

它应该是(全部在头部(你可以使用.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

+0

真棒,这工作。 – Duckdoom5

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); 
相关问题