Tyl*_*nry 8 c++ 64-bit templates bitsets
请考虑以下代码
template<unsigned int N> void foo(std::bitset<N> bs)
{ /* whatever */ }
int main()
{
bitset<8> bar;
foo(bar);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
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 {
template<size_t N> class bitset {
public:
// bit reference:
...
Run Code Online (Sandbox Code Playgroud)
例外是数组维度,您可以使用任何整数类型(甚至bool- 那么1当然可以接受的唯一大小):
// better size_t (non-negative), but other types work too
template<int N> void f(char(&)[N]);
Run Code Online (Sandbox Code Playgroud)
但在其他场合,类型必须匹配.请注意,这仅适用于自动调整的模板参数,但不适用于明确给定的参数.原因是,对于推导出的,编译器会尝试找出实际模板参数与从调用中推断出的最佳匹配.那时许多其他隐含的转换是不允许的.如果你明确地设置了参数,你可以获得全方位的转换(忽略size_t现在使用的解决方案来表达我的观点)
template<int N> void foo(std::bitset<N> bs)
{ /* whatever */ }
int main() {
bitset<8> bar;
foo<8>(bar); // no deduction, but full range of conversions
}
Run Code Online (Sandbox Code Playgroud)