Возможно ли оъявить внутренний класс, не определяя при этом класс, который его содержит?
То есть, cуществуют вложенные друг в друга классы:
// foo.hppclass Foo
{
...
class Bar { ... }
...
}
Хочется сделать что-то типа того:
// test.hpp
// #include "foo.hpp" <- не вкючаем
// пытаемся объявить внутренний класс..class Foo;
class Foo::Bar;
// ..чтобы была возможность объявить, например, следующие объекты
Foo::Bar *pDummy;
void test(Foo::Bar b);
Вопрос интересует меня, в основном, с академической точки зрения, поэтому не надо успокаивать меня, утверждая, что потребность в таком объявлении является следствием плохого дизайна
L>Насколько это общепринятая практика? Я имею в виду:
L>
L>namespace std
L>{
L> template class string<...>;
L> template class vector<...>;
L>}
L>
Пространства имен были введены для решения проблемы конфликта имен. Поэтому это даже не общепринятая, а единственно возможная практика в условиях мультибиблиотечкой среды:
L>>Насколько это общепринятая практика? Я имею в виду:
L>>
L>>namespace std
L>>{
L>> template class string<...>;
L>> template class vector<...>;
L>>}
L>>
АШ>Пространства имен были введены для решения проблемы конфликта имен. Поэтому это даже не общепринятая, а единственно возможная практика в условиях мультибиблиотечкой среды:
Это понятно. Насколько часто встречается в коде именно не включение "mylib.h" и "yourlib.h", а объявление функций и классов в них содержащихся? В заголовочных файлах. С целью ускорить компиляцию программы.
Если я правильно понимаю, то для стандартных контейнеров это сдеалть не так просто, потому что реальное количество параметров в них может зависеть от реализации STL (то есть, может быть vector<T, allocator<T>, NonDocumentedParametr = DefaultND>)...
L>Это понятно. Насколько часто встречается в коде именно не включение "mylib.h" и "yourlib.h", а объявление функций и классов в них содержащихся? В заголовочных файлах. С целью ускорить компиляцию программы.
А, вот Вы о чем... Встречается и очень даже часто, но с появлением поддержки предкомпилируемых заголовков этот подход уходит со сцены на второй план.
В качестве примера Вы можете посмотреть iosfwd из stl, который можно использовать в интерфейсной части класса использующего потовую библиотеку stl:
Здравствуйте, Liza, Вы писали:
L>Доброго времени суток!
L>Возможно ли объявить внутренний класс, не определяя при этом класс, который его содержит?
Вроде как у меня получилось: для этого внешний класс должен быть шаблонным. Тогда компилятор не будет пытаться с ним что-нибудь делать, пока не увидит его инстанцирования. Вот пример:
template <typename Dummy>
class Foo;
template <typename Dummy>
void f (typename Foo<Dummy>::Bar & b);
При компиляции VS 2003 этот код проходи на ура. У кого есть предложения или замечания?
> template <typename Dummy>
> class Foo;
>
> template <typename Dummy>
> void f (typename Foo<Dummy>::Bar & b);
>
> > При компиляции VS 2003 этот код проходи на ура. У кого есть предложения или замечания?
Единственное замечание: при вызове такой шаблонной функции копилятор не сможет вывести параметр шаблона, его прийдется указывать всегда явно. А в остальном все вполне законно.
Posted via RSDN NNTP Server 2.0
--
Справедливость выше закона. А человечность выше справедливости.
R>Единственное замечание: при вызове такой шаблонной функции копилятор не сможет вывести параметр шаблона, его прийдется указывать всегда явно. А в остальном все вполне законно.
Да, это проблема. Кроме того приходится делать класс шаблонным и связываться со всеми проблемами, которые из этого следуют. Но работает