2010-03-18 3 views
14
void foo() { 
    struct Foo { .. }; 
    std::vector<Foo> vec; // why is this illegal? 
} 

Я не возвращаю Foo во внешний мир. Это временный тип, который я использую в функции.Почему std :: vector не может быть локальным?

+0

+1 Хороший вопрос! Никогда не слышал об этом =) – SadSido

+0

@anon: Могу ли я узнать, какой компилятор вы использовали? – jasonline

+0

@anon: Я мог бы скомпилировать его на Visual C++ 2005, но, я думаю, это не соответствует стандарту, если это действительно упоминается там. – jasonline

ответ

14

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

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++ обсуждают то же самое.

3

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

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


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

  • Для MacOSX вам нужно GCC> = 4,5 с параметром -std=c++0x командной строки
  • Для компилятора Microsoft вам нужно> = VC8/VS2005 без в /Za вариант (расширений отключить язык)
Смежные вопросы