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