значения перечисления, используемые с std::map, приводят к ошибке C2664

#c #visual-studio-2010 #templates #enums

#c #visual-studio-2010 #шаблоны #перечисления

Вопрос:

Я хотел бы понять, почему код

 enum
{
   SETA_ELT1,
   SETA_ELT2,
   SETA_ELT3,
};

enum
{
   SETB_ELT1,
   SETB_ELT2,
   SETB_ELT3,
};

#define MAPPINGTYPE std::map<unsigned int, unsigned int> 
MAPPINGTYPE::value_type bijection_table[] = //<---- line 68 raising the error
{
   MAPPINGTYPE::value_type(SETA_ELT1, SETB_ELT1),
   MAPPINGTYPE::value_type(SETA_ELT2, SETB_ELT2),
   MAPPINGTYPE::value_type(SETA_ELT3, SETB_ELT3),
};

const MAPPINGTYPE bijectionMap(bijection_table, bijection_table 3);
  

не удается выполнить компиляцию в Visual studio 10 с ошибкой

 2>c:Program Files (x86)${MVCDIR}VCincludeutility(246): 
2>error C2664: 'std::forward' : cannot convert parameter 1 from '' to 'amp;'
2>          ..myfile.cpp(68) : see reference to function template instantiation 
2>'std::pair<_Ty1,_Ty2>::pair<,>(_Other1 amp;amp;,_Other2 amp;amp;)' being compiled
2>          with
2>          [
2>              _Ty1=const unsigned int,
2>              _Ty2=unsigned int,
2>              _Other1=,
2>              _Other2=
2>          ]
  

Мне нужно явно привести значения SETB_ELTX unsigned int к успешной компиляции.

Комментарии:

1. [OT]: вы можете использовать typedef вместо этого макроса

2. Он отлично компилируется с gcc-4.8.1 в режиме C 11 — см. В ideone — может быть, вам следует выбрать лучший компилятор …?

3. @TonyD Легче сказать, чем сделать.

4. @Jarod42 typedef используется только для того, чтобы избежать подробностей. Я отменяю определение в следующей строке.

5. В любом случае, вам, очевидно, нужно либо сохранить фактические перечисления на карте, либо выполнить некоторое приведение в конструкции value_type … если вы предпочитаете последнее, но вам не нравится, что оно подробное, вы можете легко создать макрос MAKE_VALUE(x, y), который выполняет подстановку.