#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), который выполняет подстановку.