2009-12-30 2 views
6

У меня есть этот код для переноса из окон в 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. Ошибка я получаю это:

main.cpp:24: error: conflicting declaration ‘CVector CTestClass::alpha_to’

main.cpp:19: error: ‘CTestClass< n, m >::alpha_to’ has a previous declaration as ‘CVector< int, CTestClass< n, m >::Size > CTestClass< n, m >::alpha_to’

main.cpp:24: error: declaration of ‘CVector< int, CTestClass< n, m >::Size > CTestClass< n, m >::alpha_to’ outside of class is not definition

ли кто-нибудь знает, как сделать это компилируется с помощью г ++?

Спасибо!

+1

Я думаю, что другой его расширение MSVC++, хотя я не уверен. Кто-то, пожалуйста, пролил свет на него. –

ответ

8

Это работает с 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; 
+0

Кажется, это решение проблемы. Спасибо большое! – Alex

-1

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

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

+0

Нет. Я не понимаю, почему ему даже не нужно инициализировать статический член. Не могли бы вы немного объяснить? –

+0

Он не инициализирует его, потому что он не дает ему никакой ценности. Он просто объявляет об этом. – Dima

+0

На самом деле CTestClass :: a зависит от параметра шаблона 'n'. Посмотрите внимательно на код. Почему бы не использовать std :: vector вместо CVector? Это не мой код, но предположим, что были некоторые причины. И на самом деле это не имеет значения - код не будет компилироваться и с std :: vector. – Alex

0

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

why not use std::vector instead of CVector?

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

+0

Вы правы. Прости, я пропустил это. Но попробуйте вынести объявление в строке 24. Я только что попробовал, и он компилируется с g ++ на cygwin. – Dima

+0

И действительно ли функциональность этого кода будет сохранена в этом случае? – Alex

+1

Да, во время компиляции не будет никакой проблемы (если он удалит эту строку), но его программа не будет связывать. –

-1

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

+0

не работает. получил ту же ошибку. – Alex

0

Я думаю, проблема с перечислением.

http://www2.research.att.com/~bs/C++0xFAQ.html#enumlink text

+0

У меня была аналогичная мысль, но я изменил размер на const int и по-прежнему получил ту же ошибку, что и обманщик (по крайней мере, на g ++ 4.1.2) –

Смежные вопросы