2012-04-08 3 views
2

Mögliche Duplizieren statisches Element Array initialisieren:
Where and why do I have to put the “template” and “typename” keywords?Wie in der Klasse mit Vorlage

#include <iostream> 
using namespace std; 

template <class T> 
class Test 
{ 
    union obj 
    { 
     union obj* next; 
     int num; 
    }; 

    static const int SZ=3; 
    static obj* volatile list[SZ]; 
}; 

template <class T> 
Test<T>::obj* volatile 
Test<T>::list[SZ]= 
{ 
    0, 0, 0 
}; 

int main() 
{ 
    return 0; 
} 

mit g ++, die Fehler, die ich bekommen ist:

 
18|error: expected constructor, destructor, or type conversion before '*' token 
+0

fügt 'typename' vor 'Test :: obj * 'hilft? –

+0

Funktioniert es, wenn Sie diese Union außerhalb der Klasse deklarieren? – rutgersmike

+0

Beide sind in Ordnung, aber ich kenne nur Letzteres. – prehistoricpenguin

Antwort

3

Fügen Sie das Keyword typenname vorhinzuin der Definition des Mitglieds.

+1

@Potatoswatter Ich denke nach dem Test :: list die Namen in Test sind im Geltungsbereich. Betrachte: 'Klasse A {Klasse B {}; Leere c (B); }; void A :: c (B) {} ' – bames53

+0

@ bames: Sie haben eigentlich Recht (Entschuldigung, wenn Sie meinen früheren Kommentar lesen). [Fallbeispiel] (http://ideone.com/C0ALx). – Xeo

+0

@ bames53 bah, Ich habe meinen Kommentar zu 'SZ' gelöscht, ich brauche eine Qualifikation, bevor ich im Standard nachschaue. §9.4.2 [class.static.data] sagt "Der Initialisiererausdruck in der Definition eines statischen Datenmembers liegt im Bereich seiner Klasse (3.3.7)", sagt aber nichts über den Deklarator selbst aus. Unter 8.4.2 [dcl.array] sehe ich auch nichts. Ich denke, das könnte ein GCC-Fehler sein. – Potatoswatter

Verwandte Themen