10

次のコードを検討してください

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

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

<8>はunsignedlongintとして解釈され、テンプレートと完全には一致しないため、g++は64ビットでこれについて文句を言います。テンプレートをunsignedlongintと言うように変更すると、32ビットコンパイルは文句を言います。

明らかにこれを修正する1つの方法は、ビットセット<8>をビットセット<8ul>に変更することですが、数値リテラルのデフォルトの解釈が何であれ機能するようにテンプレート部分を書き直す方法はありますか?

4

3 に答える 3

10

8u問題は、書くか書かないかではありません8。問題は、関数テンプレートのテンプレート パラメーターの型に関係しています。そのタイプは、 の宣言で使用されるものと一致する必要があり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_tするために now を使用するという解決策は無視してください)。

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 に答える