Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to define a static const variable of a template class

I'm trying to make a vector class with predefined static constants for up, right and forward because these should be the same in all cases. How should this be defined and is it even possible?

I'm trying to do something like this:

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

This results in a syntax error.

like image 951
Duckdoom5 Avatar asked Dec 01 '15 17:12

Duckdoom5


2 Answers

It should be (all in header (you may use .inl or .hxx if you want to split declaration from definition)):

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

like image 53
Jarod42 Avatar answered Oct 07 '22 02:10

Jarod42


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);
like image 33
SergeyA Avatar answered Oct 07 '22 04:10

SergeyA