2016-09-08 13 views
6

Класс может содержать переменный шаблон элемента, который должен быть статическим:элемента шаблон переменный, специализирующийся

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; } 
}; 

Он должен, как все статические членам быть объявлен вне области видимости класса:

Следующих компилируется и работает как Ожидаемый результат:

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

Но как специализироваться такой вар вроде следующего неработающего кода (сообщения об ошибках с GCC 6.1):

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

завершается с:

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; 

завершается с

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

Что такое правильный синтаксис здесь?

+1

Можете ли вы указать фактическую ошибку вы получаете ? – NathanOliver

+0

@NathanOliver: Done;) – Klaus

+0

Ну, это не так полезно. Я надеялся, что там будет что-то, чтобы сделать название более доступным для поиска, но, увы, компилятор здесь не помогает. – NathanOliver

ответ

7

Я полагаю, вы должны добавить пробел

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

В противном случае (если я не ошибаюсь) >=1.123 путают с «равным или greather, чем 1.123»

+2

То есть ... удивительно глупо (причина, а не ответ). – StoryTeller

+0

Я понял, где проблема, потому что я сделал ту же ошибку два часа назад :( – max66

+1

Пример того, как плохое форматирование кода может привести к ошибкам. По крайней мере, в этом случае компилятор поймал его. –

 Смежные вопросы

  • Нет связанных вопросов^_^