Comments 7
Так. Если по простому, то всё сводится к тому, что
class TDStretch *pTDStretch;
эквивалентно
class TDStretch;
TDStretch *pTDStretch;
– я правильно понял? (всегда писал только вторым способом, он прозрачен).
А то картинка с неймспейсами несколько запутала, всё пытался понять, при чём тут они...
Upd: перечитал повнимательней, ещё и не эквивалентно... Ну, лишний повод никогда не писать как в первом варианте.
не эквивалентно, потому что если дело происходит внутри класса, то первое объявит класс во внешней области, а второй вариант -- внутри класса
// uses previously-declared class '::Bar'
Замечательный способ отстрелить ногу. Если описания классов находятся в разных файлах, то компилируемость кода зависит от порядка инклюдов.
Пример с struct ::Qux::Quux {};
не компилируется на GCC https://godbolt.org/z/9nen1Yjda
Но работает на других компиляторах: https://godbolt.org/z/GqxddxTGz
Судя по всему это баг GCC: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66892
Никогда я не понимал программистов, которые используют такие атавизмы времён С на пустом месте. Использование конструкций из С в С++, да ещё и с сущностями С++ - верный способ выстрелить себе в ногу. Вы что там, боитесь написать лишнюю строчку кода?
Тонкости C++: итак, вы объявили класс…