Статическое шаблонное поле шаблонного класса?

У меня есть этот код к порту от окон до Linux.

template<class T, int Size> 
class CVector {
 /* ... */
};

template<int n, int m>
class CTestClass {
public:
 enum { Size = 1 << n };
private:
 static CVector<int, Size> a; // main.cpp:19
};

template<int n, int m>
CVector<int, CTestClass<n, m>::Size> CTestClass<n, m>::a; // main.cpp:24

Это компилирует с VS2008, но не делает с g ++ 4.3.2. Ошибка, которую я получаю:

основной cpp:24: ошибка: конфликтующее объявление ‘CVector CTestClass:: alpha_to’

основной cpp:19: ошибка: ‘CTestClass <n, m>:: alpha_to’ имеет предыдущее объявление как ‘CVector <интервал, CTestClass <n, m>:: Размер> CTestClass <n, m>:: alpha_to’

основной cpp:24: ошибка: объявление ‘CVector <интервал, CTestClass <n, m>:: Размер> CTestClass <n, m>:: alpha_to’ за пределами класса не является определением

Кто-то знает, как сделать это компилируемым через g ++?

Спасибо!

6
задан Alex 30 December 2009 в 15:09
поделиться

5 ответов

Это работает с gcc 3.4 и 4.3, а также с VC8:

template<class T, int Size> 
class CVector {
 /* ... */
};

template<int n, int m>
class CTestClass {
public:
    enum { Size = 1 << n };
    typedef CVector<int, Size> Vector;
private:
    static Vector a; 
};

template<int n, int m>
typename CTestClass<n,m>::Vector CTestClass<n,m>::a;
8
ответ дан 17 December 2019 в 02:29
поделиться

В CTestClass размер - это перечисление, а не int (по стандарту, оно зависит от реализации, перечисление не обязательно должно быть целым числом). Попробуйте использовать статический const int Size = ...

.
-1
ответ дан 17 December 2019 в 02:29
поделиться

Если вы вынесете декларацию a вне класса, она скомпилируется на cygwin с g++ v. 3.4.4.

Кстати, почему бы не использовать std::vector вместо CVector?

.
-1
ответ дан 17 December 2019 в 02:29
поделиться

На самом деле CTestClass::a действительно зависит от параметра шаблона 'n'. Посмотрите внимательно на код.

почему бы не использовать std::vector вместо CVector?

Это не мой код, но предположим, что были какие-то причины. И на самом деле это не имеет значения - код тоже не скомпилируется с std::vector.

.
0
ответ дан 17 December 2019 в 02:29
поделиться
0
ответ дан 17 December 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: