Что я могу «объявить вперед» в C ++? - PullRequest
8 голосов
/ 27 сентября 2010

Я знаю, что могу сделать

class Foo;

и, вероятно,

struct Bar;

и глобальные функции

bool IsValid(int iVal);

Как насчет типизированного перечисления?Как насчет типизированного перечисления в необъявленном классе?Как насчет функции с необъявленным классом?Как насчет статического члена в необъявленном классе?Как насчет этого в неизвестном пространстве имен?Я пропускаю что-нибудь еще, что может быть объявлено вперед?

1 Ответ

12 голосов
/ 27 сентября 2010

Можно переслать объявить

  • Шаблоны, включая частичные специализации
  • Явные специализации
  • Вложенные классы (включая структуры, "настоящие" классы и объединения)
  • Не вложенные и локальные классы
  • Переменные ("extern int a;")
  • Функции

Если под «предварительным объявлением» вы подразумеваете «объявлять, но не определять», вы также можете пересылать объявления функций-членов. Но вы не можете переопределить их в определении класса, как только они объявлены. Вы не можете пересылать-объявлять перечисления. Я не уверен, что я что-то пропустил.

Обратите внимание, что все перечисленные выше предварительные объявления, кроме частичных и явных специализаций, должны быть объявлены с использованием неквалифицированного имени, а функции-члены и вложенные классы могут быть объявлены, но не определены в определении класса. *

class A { };
class A::B; // not legal

namespace A { }
void A::f(); // not legal

namespace A { void f(); } // legal

class B { class C; }; // legal
class B::C; // declaration-only not legal

class D { template<typename T> class E; };
template<typename T> class D::E<T*>; // legal (c.f. 14.5.4/6)
...