Почему std::vector не может принимать локальный тип?

void foo() {
  struct Foo { .. };
  std::vector<Foo> vec; // why is this illegal?
}

Я не возвращаю Фу во внешний мир. Это просто временный тип, который я использую в функции.

2 ответа

Решение

Локальный класс не может быть аргументом шаблона. Потому что стандарт гласит:

14.3.1 параграф 2: "Локальный тип, тип без связи, безымянный тип или тип, составленный из любого из этих типов, не должны использоваться в качестве аргумента шаблона для параметра типа шаблона".

[Example:
template <class T> class X { /* ... */ };
void f()
{
struct S { /* ... */ };
X<S> x3; // error: local type used as templateargument
X<S*> x4; // error: pointer to local type used as templateargument
}
-end example] [Note: a template type argument may be an incomplete
type (3.9). ]"

Один обходной путь предлагается здесь на clC++. Модерируется.

ОБНОВЛЕНИЕ: Было некоторое обсуждение того, почему невозможно использовать локальные классы в качестве аргументов шаблона? Ссылки здесь и здесь на c.std.C++ обсуждают одно и то же.

Краткий ответ: потому что стандарт C++ говорит так (раздел 14.3.1)

Длинный ответ: во время стандартизации C++ комитет по стандартам C++ полагал, что возникнут проблемы с реализацией и производительностью. Эти опасения оказались беспочвенными, и в окончательном варианте стандарта C++0x они полностью изменили свое решение.


С практической точки зрения, некоторые компиляторы уже поддерживают новые правила C++0x:

  • Для MacOSX вам понадобится gcc >=4.5 с -std=c++0x параметр командной строки
  • Для компилятора Microsoft вам понадобится>=vc8/VS2005 без /Za опция (отключить языковые расширения)
Другие вопросы по тегам