2015-12-01 3 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 ': элемент статических данных с инициализатором в классе должен иметь нелетучий константный интегральный тип' – 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); 
Смежные вопросы