枚举作为基类的模板参数始终失败,未解决的错误

时间:2018-02-06 06:04:49

标签: c++

我有一个Enum和简单的基类,看起来像这样,

enum E
   {
     a,
     b
   };
 template<E e> 
   struct Base
   {
     static int i;
   };

及其子女,

 struct CC
   {
     template<E e, class T>
     struct C;
     template<class T>
     struct C<a, T> : Base<a>
     {
       void Do(int i)
       {  
         Base<a>::i=i;
       }
     };

     template<class T>
     struct C<b, T> : Base<b>
     {
       void Do(int i)
       {  
          Base<b>::i=i;
       }
     };

     template<E e, typename T>
     void Do(int i)
     {
        C<e,T>->Do(i);
     } 
};

我想在模板中传递的枚举值专用的两个结构中的任何一个中调用Do。如果是E::a,则拨打Do的{​​{1}}或C<a>。 我在Build之后得到的错误是C<b>

1 个答案:

答案 0 :(得分:0)

您需要定义static类成员变量。

在文件范围内写下:

int Base<a>::i;
int Base<b>::i;

来自CppReference

  

static关键字仅用于在类定义中声明静态成员,但不与静态成员的定义一起使用:

class X { static int n; }; // declaration (uses 'static')
int X::n = 1;              // definition (does not use 'static')
     

类主体内的声明不是定义,可以声明该成员的类型不完整(void除外),包括声明成员的类型: