Можно переслать объявить
- Шаблоны, включая частичные специализации
- Явные специализации
- Вложенные классы (включая структуры, "настоящие" классы и объединения)
- Не вложенные и локальные классы
- Переменные ("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)