How to define a static const variable of a template class
Asked Answered
J

2

10

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.

Jabin answered 1/12, 2015 at 17:37 Comment(6)
It should be static const vec3 right; in class.Fabriane
BTW, I doubt that you want the definition in .cpp as it continue to depend on T.Fabriane
@Fabriane how would it be defined in the header? If I try = vec3(1,0,0);'vec3<T>::right': a static data member with an in-class initializer must have non-volatile const integral type`Jabin
You likely want template <typename T> const vec3<T> vec3<T>::right(1, 0, 0); in the header!Gwyngwyneth
@DieterLücking That gives a compiler error with right(<error-type>, <error-type>, <error-type>)Jabin
@Jabin compiles fine with g++ after fixing: error: expected ‘;’ after class definitionGwyngwyneth
F
13

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

Fabriane answered 1/12, 2015 at 17:46 Comment(0)
M
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 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);
Midlothian answered 1/12, 2015 at 17:46 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.