2016-09-08 94 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... 

但如何专门像下面的非工作代码这样的VAR(用gcc 6.1的错误消息):

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; 

什么是这里的正确的语法失败:

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

与失败?

+1

能否请您包括您得到的实际错误? – NathanOliver

+0

@NathanOliver:完成;) – Klaus

+0

那些不是那么有帮助。我希望能有更多可搜索的内容,但唉,编译器在这里没有帮助。 – NathanOliver

回答

7

我想你应该添加一个空格

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

否则(如果我没看错)>=1.123被混淆“等于或大于1.123 greather”

+2

这是......非常愚蠢(原因,而不是答案)。 – StoryTeller

+0

我知道问题出在哪里了,因为两个小时前我已经做了同样的错误:( – max66

+1

一个糟糕的代码格式化实际上会导致错误的例子。至少在这种情况下,编译器发现了它。 –