Почему 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
опция (отключить языковые расширения)