1

struct可変個引数テンプレートを使用して、テンプレートパラメータとしてに渡される要素の数をカウントするTMPを作成しています。これは私のコードです:

template<class T, T... t>
struct count;

template<class T, T h, T... t> 
struct count<T, h, t...>{
 static const int value = 1 + count<T, t...>::value;
};

template<class T>
struct count<T>{
 static const int value = 0;
};

template<>
struct count<std::string, std::string h, std::string... l>{
 static const int value = 1 + count<std::string, l...>::value;
};

template<>
struct count<std::string>{
 static const int value = 0;
};

int main(){
 std::cout << count<int, 10,22,33,44,56>::value << '\n';
 std::cout << count<bool, true, false>::value << '\n';
 std::cout << count<std::string, "some">::value << '\n';
 return 0;

}

を教えてくれるので、 countwithの3番目のインスタンス化でエラーが発生します。これに対する回避策はありますか?std::stringg++ 4.7error: ‘class std::basic_string<char>’ is not a valid type for a template non-type parameter

4

2 に答える 2

2

問題はタイプではなく、呼び出しstd::stringのリテラルです"some"

std::cout << count<std::string, "some">::value << '\n';

残念ながら、この回答またはその回答にも記載されているように、文字列または浮動小数点リテラルをテンプレートに渡すことはできません。

于 2012-07-20T23:07:23.413 に答える
1

失望させて申し訳ありませんが、これを回避する方法はありません。非型テンプレートパラメータは、次のようなプリミティブ型のみにすることができます。

  • 積分または列挙
  • オブジェクトへのポインタまたは関数へのポインタ
  • オブジェクトへの参照または関数への参照
  • メンバーへのポインタ

std::stringまたは他のタイプは単にそこでは機能しません。

于 2012-07-20T23:05:24.577 に答える