10

gcc 4.5.1, SuSE Linux i686C++ membri dei modelli statici emissione di inizializzazione

Supponiamo di avere seguente codice:

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 questo caso non avrà alcun output in stdout. Compilatore non genererà il codice per inizializzare float e double specializzazione della classe A.

Ma .. se cambieremo inizializzazioni come questo:

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

il compilatore genera tale codice e avremo doppio "B()" nell'output.

Qualcuno può aiutarmi a comprendere un simile comportamento?

risposta

8

n3337 14.7.3/13

una specializzazione esplicita di un membro di dati statici di un modello è una definizione se la dichiarazione comprende un inizializzazione; altrimenti, è una dichiarazione. [Nota: La definizione di un membro di dati statici di un modello che richiede l'inizializzazione di default deve utilizzare un rinforzato-init-list:

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

- END Nota]

braced-init-list è C++11 caratteristica, quindi in C++03 è possibile utilizzare solo

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

Grazie per la risposta! – Ribtoks

+0

Quindi cosa si fa se 'x' deve essere inizializzato dal costruttore predefinito (senza C++ 11)? – VF1