String argumen templat vs. int [duplikat]

Kemungkinan Duplikat:
String sebagai argumen template?

Mengapa deklarasi pertama oke, tapi deklarasi kedua tidak? Mengapa std::string tidak cocok?

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

using namespace std;

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

Saya mendapat:

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

menggunakan dentang++.


person Cartesius00    schedule 24.11.2012    source sumber


Jawaban (2)


Anda tidak bisa memiliki parameter templat bertipe std::string. Aturan untuk parameter templat non-tipe ditentukan oleh standar sebagai berikut (§14.1/4):

parameter-template non-tipe harus memiliki salah satu dari tipe berikut (opsional memenuhi syarat cv):

  • tipe integral atau enumerasi,
  • penunjuk ke objek atau penunjuk ke fungsi,
  • referensi nilai ke objek atau referensi nilai ke fungsi,
  • penunjuk ke anggota,
  • std::nullptr_t.

Selain itu (§14.1/7):

parameter-template non-tipe tidak boleh dinyatakan memiliki tipe floating point, kelas, atau void.

Karena std::string adalah tipe kelas, pembuatan instance foo Anda tidak diperbolehkan.

person Joseph Mansfield    schedule 24.11.2012

Karena parameter templat non-tipe (nama jelek untuk "nilai") harus dapat dihitung pada waktu kompilasi dan std::string tidak (mungkin memerlukan alokasi memori dinamis sehingga konstruktornya bukan constexpr).

person Matthieu M.    schedule 24.11.2012