void foo() {
struct Foo { .. };
std::vector<Foo> vec; // why is this illegal?
}
Я не возвращаю Foo во внешний мир. Это временный тип, который я использую в функции.Почему std :: vector не может быть локальным?
void foo() {
struct Foo { .. };
std::vector<Foo> vec; // why is this illegal?
}
Я не возвращаю Foo во внешний мир. Это временный тип, который я использую в функции.Почему std :: vector не может быть локальным?
Локальный класс не может быть аргументом шаблона. Поскольку стандарт говорит: -
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). ]"
Обойти предлагается here на c.l.C++. Модерацию.
ОБНОВЛЕНИЕ: Было некоторое обсуждение того, почему в качестве аргументов шаблона не возможно использовать локальные классы? Ссылки here и here на c.std.C++ обсуждают то же самое.
Короткий ответ: Поскольку C++ стандарт говорит так (раздел 14.3.1
)
Длинный ответ: В то время, C++ был стандартизирован, комитет по стандартизации C++ полагают, что было бы внедрение и производительность вопросы. Эти опасения оказались необоснованными, и по окончательному проекту стандарта C++ 0x они отменили это решение.
На более практическом примечании, некоторые компиляторы уже поддерживают новые правила C++ 0x:
-std=c++0x
командной строки/Za
вариант (расширений отключить язык)
+1 Хороший вопрос! Никогда не слышал об этом =) – SadSido
@anon: Могу ли я узнать, какой компилятор вы использовали? – jasonline
@anon: Я мог бы скомпилировать его на Visual C++ 2005, но, я думаю, это не соответствует стандарту, если это действительно упоминается там. – jasonline