我有以下代码:
template<int lengthAfter>
class VariableString{
public:
enum{
fieldSize = -1000
};
....
};
template<typename T, int FieldSize = sizeof(T)>
class field_trait{
public:
enum{
fieldSize = FieldSize
};
....
};
template<int lengthAfter>
class field_trait<VariableString<lengthAfter>, -1000>{
public:
enum{
fieldSize = -1000
};
....
};
static_assert(field_trait<VariableString<0> >::fieldSize == -1000, "VariableString length error");
当我编译时,static_assert
失败,我希望专业化能够工作。我哪里错了?
答案 0 :(得分:1)
您的专业化仅适用于-1000的第二个参数,但它是sizeof(first argument)
,因为主模板中的默认值为。也就是说,您的调用实际上等同于
field_trait,sizeof(VariableString&lt; 0&gt;)&gt;
这样做
template<int lengthAfter, int size>
class field_trait<VariableString<lengthAfter>, size>