Почему std :: vector не может принимать локальный тип? - PullRequest
14 голосов
/ 18 марта 2010
void foo() {
  struct Foo { .. };
  std::vector<Foo> vec; // why is this illegal?
}

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

Ответы [ 2 ]

14 голосов
/ 18 марта 2010

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

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.c ++. Модерируется.

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

3 голосов
/ 30 марта 2010

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

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


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

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