Как правильно специализировать шаблонный статический член const того же типа, что и его родитель - PullRequest
1 голос
/ 26 декабря 2011

Если заголовок неясен, код должен помочь уточнить:

// .h file    
template<class T> class DF_Vector3
{
public:

    T x, y, z;

    static const DF_Vector3 ZERO;

    DF_Vector3() {}
    DF_Vector3( T F );
    DF_Vector3( T X, T Y, T Z );
};

typedef DF_Vector3<DF_FLOAT> DF_Vector3F;

// .cpp file
template<> const DF_Vector3F DF_Vector3F::ZERO( 0.0f, 0.0f, 0.0f ); // ERROR: Explicit specialization of 'ZERO' after instantiation

Компилятор впоследствии ссылается на другое место, где есть ссылка на DF_Vector3F :: ZERO, и заявляет: «Здесь сначала требуется неявная реализация.

Компилятор Visual Studio 2010, похоже, не против этого. Однако компилятору Apple CLANG (LLVM) это не нравится (он жалуется).

Есть ли способ это исправить? Спасибо.

1 Ответ

2 голосов
/ 26 декабря 2011

Вы не можете использовать typedef в определении статических членов, потому что к тому времени, когда у вас есть typedef, шаблон класса уже создан, после чего вы не можете специализировать его членов (членов).

Вы должны сделать это:

//general case
template<class T> 
const DF_Vector3<T> DF_Vector3<T>::ZERO;

//specialization
template<> 
const DF_Vector3<DF_FLOAT> DF_Vector3<DF_FLOAT>::ZERO(0.0f, 0.0f, 0.0f);

//after that define the typedef
typedef DF_Vector3<DF_FLOAT> DF_Vector3F; //after

Демо: http://ideone.com/AMWMC

...