шаблон с enum не может инициализировать свой член значением аргумента шаблона POD - PullRequest
1 голос
/ 24 августа 2011

Я пытаюсь создать легкий шаблонный класс, имеющий статический член, инициализированный значением, указанным в качестве аргумента шаблона (разрешены только enum).

Приведенный ниже код не создает поговорку

   error: wrong number of template arguments (1, should be 2)
   error: provided for ‘template<field_id field_value, 
   inner_type_id innter_type_value>     struct node’
   error: template declaration of ‘field_id m_field_id’

Проблема кажется первым аргументом шаблона. Если я удалю 'field_value' и 'inneer_type_value', он все равно не создаст сообщение об ошибке несоответствия.

Вы можете мне помочь? Спасибо AFG

   enum field_id{ FIELD_ID_1, FIELD_I_2  };
   enum inner_type_id{ INN_ID_1, INN_ID_2  };

    template< enum field_id  field_value
            , enum inner_type_id inner_type_value 
    >struct node{
            static field_id m_field_id;
    };

    template< 
            enum field_id  field_value
            ,enum inner_type_id inner_type_value 
    >
    enum field_id node<
            enum field_id field_value
            ,enum inner_type_id inner_type_value
    >::m_field_id=field_value;

    int main(){
           node<FIELD_ID_1,INN_ID_1> obj;
           assert( obj::m_field_value == FIELD_ID );
    }

Я также использую другой подход, но все же не понимаю

         template< typename T1, typename T2 >
         struct node;

         template<>
         struct node< enum field_id=FIELD_ID_1, enum inner_type_id=INN_ID_1>{
              static enum field_id m_field_id;
         };             
         note< 
               enum field_id=FIELD_ID_1
              ,enum inner_type_id=INN_ID_1
              >::m_field_id=FIELD_ID1;

Ответы [ 4 ]

4 голосов
/ 24 августа 2011

Ключевое слово enum не может появляться в шаблоне - просто используйте имя типа:

template<field_id field_value, inner_type_id inner_type_value> struct ...
1 голос
/ 24 августа 2011

Редактировать: опубликовал неправильный ответ. Кроме того, вы можете сделать статическое поле const и определить его встроенным:

template<field_id  field_value
        , inner_type_id inner_type_value 
>struct node{
        static const field_id m_field_id=field_value;
};
1 голос
/ 24 августа 2011

В конце ваш код, вероятно, должен выглядеть так:

enum field_id{ FIELD_ID_1, FIELD_I_2  };
enum inner_type_id{ INN_ID_1, INN_ID_2  };

template<field_id  field_value, inner_type_id inner_type_value>
//       ^ no enum keyword
struct node
{
  static field_id m_field_id;
};

template<field_id  field_value, inner_type_id inner_type_value>
field_id node<field_value, inner_type_value>::m_field_id = field_value;
//            ^ no enum and type

int main(){
  typedef node<FIELD_ID_1,INN_ID_1> my_type;
  assert( my_type::m_field_id == FIELD_ID_1 );
  //               ^ there's only m_field_id member
  my_type obj;
}
0 голосов
/ 24 августа 2011

Почему вы повторяете типы параметров шаблона при создании статической переменной?Я просто напишу:

template <field_id field_value, inner_type_id inner_type_value>
field_id node <field_value, inner_type_value>::m_field_id = field_value;

Редактировать: этот компилятор с gcc и работает как положено.

...