void foo() {
struct Foo { .. };
std::vector<Foo> vec; // why is this illegal?
}
Я не возвращаю Foo во внешний мир. Это - просто временный тип, который я использую в функции.
Локальный класс не может быть аргументом шаблона. Поскольку в стандарте сказано: -
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:
-std=c++0x
/Za
(отключение языковых расширений)