10

考虑以下代码

template<unsigned int N> void foo(std::bitset<N> bs)
{ /* whatever */ }

int main()
{
    bitset<8> bar;
    foo(bar);
    return 0;
}

g++ 在 64 位上抱怨这一点,因为 <8> 被解释为无符号长整数,它与模板不完全匹配。如果我将模板更改为 unsigned long int,则 32 位编译会抱怨。

显然,解决此问题的一种方法是将 bitset<8> 更改为 bitset<8ul>,但是有没有办法重新编写模板部分,以便它可以与数字文字的默认解释一起使用?

4

3 回答 3

10

问题不在于你是否写8u8。问题与函数模板的模板参数类型有关。它的类型必须与声明中使用的类型相匹配std::bitset。这是size_t根据标准(部分23.3.5

namespace std {
    template<size_t N> class bitset {
    public:
    // bit reference:
        ...

数组维度是个例外,您可以使用任何整数类型(当然bool,唯一可以接受的大小是1):

// better size_t (non-negative), but other types work too
template<int N> void f(char(&)[N]);

但在其他情况下,类型必须匹配。请注意,这仅适用于自动推导的模板参数,但不适用于显式给定的参数。原因是对于推导的,编译器试图找出实际模板参数和它从调用中推导出的内容之间的最佳匹配。然后不允许许多其他隐式转换。如果您明确提出论点,则可以进行全部转换(忽略使用size_tnow 来说明我的观点的解决方案)

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
}
于 2009-03-14T03:21:11.483 回答
4

使用size_t. 至少 MSDN 这么说。

于 2009-03-14T02:23:49.453 回答
0

无论平台如何,数字文字都应解释为 int

于 2009-03-14T02:09:15.900 回答