为什么编译器会在这里抱怨?
enum jit_ptx_type {f32=0,f64=1,u16=2,u32=3,u64=4,s16=5,s32=6,s64=7,u8=8,b16=9,b32=10,b64=11,pred=12 };
//
// MATCHING C TYPES TO PTX TYPES
//
template<class T> struct jit_type {};
template<> struct jit_type<float> { enum { value = jit_ptx_type::f32 }; };
template<> struct jit_type<double> { enum { value = jit_ptx_type::f64 }; };
template<> struct jit_type<int> { enum { value = jit_ptx_type::s32 }; };
template<> struct jit_type<bool> { enum { value = jit_ptx_type::pred }; };
稍后在代码中:
some_func( float val ) {
jit_ptx_type type = jit_type<float>::value; // compiler complains here
}
编译器消息:
error: cannot convert ‘jit_type<float>::<anonymous enum>’ to ‘jit_ptx_type’ in assignment
太奇怪了!如果我把这些行放到一个单独的小例子文件中就可以了。
答案 0 :(得分:2)
我会把外部枚举变成一个范围内的枚举:
enum class jit_ptx_type {
f32=0, //note the =x is unnecessary here
f64=1,
u16=2,
u32=3,
u64=4,
s16=5,
s32=6,
s64=7,
u8=8,
b16=9,
b32=10,
b64=11,
pred=12
};
现在,您不会使用所有这些标识符污染周围的范围,并且您需要范围限定符来访问值,而未编组的枚举不允许这样做。接下来,在您的类中,只需使用静态常量成员:
template<> struct jit_type<float> {
static constexpr value = jit_ptx_type::f32;
};