3

重複の可能性:
テンプレート引数としての文字列?

最初の宣言は問題ないのに、2 番目の宣言は問題ないのはなぜですか? なぜstd::string適していないのですか?

template <typename T, T x> struct foo { };

using namespace std;

int main()
{
    foo<int, 0> f_int;              // ok
    foo<string, ""> f_string;      // not ok
}

私は得る:

error: a non-type template parameter cannot have type 'std::basic_string<char>'

クラン++を使用。

4

2 に答える 2

8

type のテンプレート パラメータを持つことはできませんstd::string。非型テンプレート パラメーターの規則は、次のように標準で定義されています (§14.1/4)。

タイプ以外のテンプレート パラメータには、次のいずれかのタイプ (オプションでcv-qualified ) が必要です。

  • 整数型または列挙型、
  • オブジェクトへのポインタまたは関数へのポインタ、
  • オブジェクトへの左辺値参照または関数への左辺値参照、
  • メンバーへのポインター、
  • std::nullptr_t.

さらに (§14.1/7):

非型テンプレート パラメータは、浮動小数点、クラス、または void 型を持つように宣言してはなりません。

std::stringクラス型であるため、 のインスタンス化はfoo許可されていません。

于 2012-11-24T17:07:17.530 に答える
5

非型のテンプレート パラメーター (「値」の醜い名前) はコンパイル時に計算可能でstd::stringある必要がありますが、そうではありません (動的メモリ割り当てが必要な場合があるため、そのコンストラクターは ではありませんconstexpr)。

于 2012-11-24T17:07:10.377 に答える