8


3

次のコードを見てください

template void foo(std :: bitset bs){/ *何でも* /}

int main(){bitset <8> bar; foo(バー) 0を返します。 }

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

明らかにこれを修正する1つの方法はbitset <8>をbitset <8ul>に変更することですが、数値リテラルのデフォルトの解釈がどんなものでもうまくいくように_template_部分を書き直す方法はありますか?

3 Answer


8


問題は、「+ 8u 」と「+8」のどちらを書くかではありません。 問題は関数テンプレートのテンプレートパラメータの型に関係しています。 その型は、 `+ std

bitset `の宣言で使用されるものと一致する必要があります。 これは、標準に従って「 size_t 」です(セクション「+23.3.5」)

namespace std {
    template class bitset {
    public:
    // bit reference:
        ...

例外は配列の次元で、任意の整数型を使用できます( `+ bool `でも-受け入れられる唯一のサイズはもちろん ` 1 +`です):

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

しかし他の場合には、型は一致しなければなりません。 これは自動推定されたテンプレート引数にのみ当てはまりますが、明示的に与えられた引数には当てはまりません。 その理由は、推論されたものに対して、コンパイラは実際のテンプレート引数とそれがその呼び出しから推論されたものとの間の最良の一致を見つけ出そうとするからです。 そうでなければ暗黙のうちに変換の多くは許可されていません。 引数を明示的に指定すると、変換の全範囲が使用可能になります(今、私のポイントを示すために `+ size_t +`を使用する解決策を無視します)

template void foo(std::bitset bs)
{ /* whatever */ }

int main() {
    bitset<8> bar;
    foo<8>(bar); // no deduction, but full range of conversions
}


3


`+ size_t +`を使用します。 それで、少なくともMSDNを言ってください。


0


数値リテラルはプラットフォームに関係なくintとして解釈されるべきです