Почему не может станд.:: векторное взятие локальный тип?

void foo() {
  struct Foo { .. };
  std::vector<Foo> vec; // why is this illegal?
}

Я не возвращаю Foo во внешний мир. Это - просто временный тип, который я использую в функции.

14
задан Peter Alexander 18 March 2010 в 10:33
поделиться

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

14
ответ дан 1 December 2019 в 13:47
поделиться

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

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


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

  • Для MacOSX вам понадобится gcc >=4. 5 с параметром командной строки -std=c++0x
  • Для компилятора Microsoft вам понадобится >=vc8/VS2005 без опции /Za (отключение языковых расширений)
3
ответ дан 1 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: