2016-09-08 19 views
6

Klasa może zawierać zmienną szablonu członek, który musi być statyczna:członkiem szablon zmienna specjalizujący

class B 
{ 
    public: 
     template <typename X> 
      static X var; 

     B() { std::cout << "Create B " << __PRETTY_FUNCTION__ << std::endl; } 

     template <typename T> 
     void Print() { std::cout << "Value is " << var<T> << std::endl; } 
}; 

Musi członkowie jak wszyscy statyczne być zadeklarowane poza zakresem Klasa:

Poniższe kompiluje i działa jako oczekuje:

template<typename T> T B::var=9; // makes only sense for int,float,double... 

ale jak się specjalizować takiego jak poniżej var nieprzestrzegania kodeksu pracy (komunikaty o błędach z GCC 6.1):

template <> double B::var<double>=1.123; 

katastrofy z:

main.cpp:49:23: error: parse error in template argument list 
template <> double B::var<double>= 1.123; 
         ^~~~~~~~~~~~~~~~~~ 
main.cpp:49:23: error: template argument 1 is invalid 
main.cpp:49:23: error: template-id 'var<<expression error> >' for 'B::var' does not match any template declaration 
main.cpp:38:22: note: candidate is: template<class X> T B::var<T> 
      static X var; 

template <> double B::var=1.123; 

katastrofy z

template <> double B::var=1.123; 
         ^~~ 
main.cpp:38:22: note: does not match member template declaration here 
      static X var; 

jaka jest poprawna składnia tutaj?

+1

Czy możesz to rzeczywisty błąd można dostać ? – NathanOliver

+0

@NathanOliver: Gotowe;) – Klaus

+0

Cóż, te są mniej niż pomocne. Miałem nadzieję, że będzie tam coś, co sprawi, że tytuł będzie łatwiejszy do przeszukiwania, ale niestety kompilator nie pomaga tutaj. – NathanOliver

Odpowiedz

7

Przypuszczam, należy dodać spację

template <> double B::var<double> = 1.123; 
           ^here 

W przeciwnym wypadku (jeśli się nie mylę) >=1.123 jest mylony z „równe lub greather niż 1,123”

+2

To jest ... niesamowicie głupie (przyczyna, a nie odpowiedź). – StoryTeller

+0

Rozumiem, gdzie jest problem, ponieważ dwa razy temu popełniłem ten sam błąd :( – max66

+1

Przykład tego, jak złe formatowanie kodu może faktycznie prowadzić do błędów. Przynajmniej w tym przypadku kompilator go przechwycił. –