请考虑以下代码
templatevoid foo(std::bitset bs) { /* whatever */ } int main() { bitset<8> bar; foo(bar); return 0; }
g ++在64位上抱怨这个,因为<8>被解释为unsigned long int,它与模板不完全匹配.如果我将模板更改为unsigned long int,那么32位编译会抱怨.
显然,解决这个问题的一种方法是将bitset <8>更改为bitset <8ul>,但有没有办法重新编写模板部分,以便它可以使用数字文字的默认解释?
问题不在于你是否写作8u
或8
.问题与功能模板的模板参数类型有关.它的类型必须与声明中使用的类型相匹配std::bitset
.那是size_t
根据标准(部分23.3.5
)
namespace std { templateclass bitset { public: // bit reference: ...
例外是数组维度,您可以使用任何整数类型(甚至bool
- 那么1
当然可以接受的唯一大小):
// better size_t (non-negative), but other types work too templatevoid f(char(&)[N]);
但在其他场合,类型必须匹配.请注意,这仅适用于自动调整的模板参数,但不适用于明确给定的参数.原因是,对于推导出的,编译器会尝试找出实际模板参数与从调用中推断出的最佳匹配.那时许多其他隐含的转换是不允许的.如果你明确地设置了参数,你可以获得全方位的转换(忽略size_t
现在使用的解决方案来表达我的观点)
templatevoid foo(std::bitset bs) { /* whatever */ } int main() { bitset<8> bar; foo<8>(bar); // no deduction, but full range of conversions }