2010-02-10 2 views
3

В предыдущем Q & A (How do I define friends in global namespace within another C++ namespace?) решение было дано для создания друга определение функции в пространстве имен, которое ссылается на функцию в глобальном пространстве имен.Как определить класс друга из глобального пространства имен в другом пространстве имен?

У меня тот же вопрос для классы.

class CBaseSD; 

namespace cb { 
class CBase 
{ 
    friend class ::CBaseSD; // <-- this does not work!? 
private: 
    int m_type; 
public: 
    CBase(int t) : m_type(t) {}; 
}; 
}; // namespace cb 

class CBaseSD 
{ 
private: 
    cb::CBase* m_base; 
public: 
    CBaseSD(cb::CBase* base) : m_base(base) {}; 
    int* getTypePtr() 
    { return &(m_base->m_type); }; 
}; 

Если я ставлю CBaseSD в пространство имен, оно будет работать; например, класс друга SD :: CBaseSD; , но я не нашел заклинание, которое работает для глобального пространства имен.

Я компилирую с g ++ 4.1.2.

+2

Работает хорошо здесь (VC++ 2008) – Manuel

+0

GCC, кажется, жалуются на ненужную точку с запятой после закрывающей фигурной скобки имен Сь – Manuel

+0

Manuel прав его работоспособность даже в vC++ 2003, поэтому 1+. – Ashish

ответ

-2

добавить опережающее объявление как ниже

 
namespace { 
    // anonymous namespace declaration 
    class CBaseSD; 
} 

then your normal 

friend class CBaseSD;// no need of :: 

работ в CBase

+0

forward объявления по умолчанию находятся в области файлов. Мы можем просто объявить в глобальном масштабе :-) –

+0

Не путайте анонимные и глобальные пространства имен –

Смежные вопросы