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

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

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

Ответы

Ответ 1

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

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). ]"

Предлагается одно обходное решение здесь на c.l.С++. moderated.

UPDATE: Было какое-то обсуждение вопроса о том, почему нельзя использовать локальные классы в качестве аргументов шаблона? Ссылки здесь и здесь на c.std.С++ обсуждают тоже самое.

Ответ 2

Короткий ответ: Поскольку стандарт С++ так говорит (раздел 14.3.1)

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


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

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