2009-12-30 14 views
6

Ich habe diesen Code zu Port von Windows zu Linux.Statisches Vorlagenfeld der Vorlagenklasse?

Es kompiliert mit VS2008, aber nicht mit g ++ 4.3.2. Der Fehler, den ich erhalten ist:

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

Kennt jemand wie man es machen übersetzbar über g ++?

Danke!

+1

denke ich, seine andere MSVC++ Erweiterung obwohl ich nicht sicher bin. Jemand bitte werfen Sie etwas Licht darüber. –

Antwort

8

Das mit gcc 3.4 & 4.3 sowie VC8 funktioniert:

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

Scheint eine Lösung für das Problem zu sein. Vielen Dank! – Alex

-1

Wenn Sie die Deklaration a außerhalb der Klasse herausnehmen, kompiliert es auf Cygwin mit g ++ v. 3.4.4.

Übrigens, warum nicht std::vector anstelle von CVector verwenden?

+0

Nein, ich verstehe nicht, warum er das statische Mitglied nicht einmal initialisieren muss. Kannst du etwas erklären? –

+0

Er initialisiert es nicht, weil er ihm keinen Wert gibt. Er erklärt es einfach. – Dima

+0

Tatsächlich hängt CTestClass :: a does vom Template-Parameter 'n' ab. Schaue genau auf den Code. warum nicht std :: vector anstelle von CVector verwenden? Es ist nicht mein Code, aber angenommen, es gab einige Gründe. Und tatsächlich ist es egal - Code wird auch nicht mit std :: vector kompiliert. – Alex

0

Tatsächlich hängt CTestClass :: a does von Vorlagenparameter 'n' ab. Schaue genau auf den Code.

why not use std::vector instead of CVector?

Es ist nicht mein Code, aber angenommen es gab einige Gründe. Und in der Tat ist es egal - Code wird auch nicht kompiliert mit std::vector.

+0

Sie haben Recht. Entschuldigung, ich habe es verpasst. Aber versuchen Sie, die Deklaration in Zeile 24 herauszunehmen. Ich habe es gerade ausprobiert und es kompiliert mit g ++ auf Cygwin. – Dima

+0

Und wird die Funktionalität dieses Codes in diesem Fall gespeichert? – Alex

+1

Ja, es wird kein Problem zum Zeitpunkt der Kompilierung geben (wenn er diese Zeile löscht), aber sein Programm wird dann nicht verlinken. –

-1

In CTestClass ist Größe eine enum und kein int (standardmäßig ist es implementierungsabhängig, enum muss keine ganze Zahl sein). Versuchen Sie es mit einem statischen const int Größe = ...

+0

funktioniert nicht. hat denselben Fehler erhalten. – Alex

Verwandte Themen