Строка аргумента шаблона или int

Возможное дублирование:
Строки в качестве аргументов шаблона?

Почему первое объявление подходит, а второе - нет? Почему 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>'

используя clang ++.


person Cartesius00    schedule 24.11.2012    source источник


Ответы (2)


У вас просто не может быть параметра шаблона типа std::string. Правила для параметров шаблона, не являющегося типом, определены стандартом следующим образом (§14.1 / 4):

Не-типовой параметр-шаблона должен иметь один из следующих (необязательно cv-квалифицированный) типов:

  • целочисленный или перечислимый тип,
  • указатель на объект или указатель на функцию,
  • lvalue ссылка на объект или lvalue ссылка на функцию,
  • указатель на член,
  • std::nullptr_t.

Кроме того (§14.1 / 7):

Не относящийся к типу параметр-шаблона не должен объявляться как имеющий тип с плавающей запятой, класс или тип void.

Поскольку std::string является типом класса, создание экземпляра foo не допускается.

person Joseph Mansfield    schedule 24.11.2012

Поскольку параметр шаблона без типа (уродливое имя для «значения») должен быть вычислимым во время компиляции, а std::string - нет (может потребоваться динамическое выделение памяти, поэтому его конструктор не constexpr).

person Matthieu M.    schedule 24.11.2012