2012-09-12 16 views
10

gcc 4.5.1, SuSE Linux i686C++ statische Vorlage Mitglieder Initialisierung Ausgabe

Angenommen, wir folgenden Code haben:

template<typename realT> class B 
{ 
public: 
    B() {std::cout << "B()" << std::endl;} 
}; 

template<typename realT> class A 
{ 
public: 
    static B<realT> static_var; 
}; 

template<typename realT> B<realT> A<realT>::static_var; 
template<> B<float> A<float>::static_var; 
template<> B<double> A<double>::static_var; 

int main() 
{ 
    A<float> test; 
    return 0; 
} 

In diesem Fall werden wir keine Ausgabe in stdout haben. Compiler keinen Code generieren float und double Spezialisierung der Klasse A.

Aber .. zu initialisieren, wenn wir Initialisierungen wie dies ändern werde:

template<> B<float> A<float>::static_var = B<float>(); 
template<> B<double> A<double>::static_var = B<double>(); 

der Compiler einen solchen Code generieren und wir haben Doppel "B()" in der Ausgabe.

Kann mir jemand helfen, solche Verhaltensweisen zu verstehen?

Antwort

8

n3337 14.7.3/13

Eine explizite Spezialisierung eines statischen Datenelement einer Vorlage ist eine Definition, wenn die Erklärung eines Initialisierer enthält; Ansonsten ist es eine Deklaration. [Anmerkung: Die Definition eines statischen Datenelement einer Vorlage, die Standardinitialisierung erfordert einen verspannten-init-Liste verwenden müssen:

template<> X Q<int>::x; // declaration 
template<> X Q<int>::x(); // error: declares a function 
template<> X Q<int>::x { };// definition 

- Endnote]

braced-init-list ist C++11 Funktion, so in C++03 können Sie nur

verwenden
template<> X Q<int>::x = ...; 
+0

Danke für Ihre Antwort! – Ribtoks

+0

Also, was tun Sie, wenn 'x' mit dem Standardkonstruktor (ohne C++ 11) initialisiert werden soll? – VF1

Verwandte Themen