Как определить класс друга из глобального пространства имен в другом пространстве имен? - PullRequest
4 голосов
/ 10 февраля 2010

В предыдущих вопросах и ответах ( Как определить друзей в глобальном пространстве имен в другом пространстве имен C ++? ) было предложено решение для определения функции функции друга в пространстве имен, которое ссылается на к функции в глобальном пространстве имен.

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

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 ]

0 голосов
/ 07 июня 2019

Как указано в некоторых комментариях ниже вопроса, кажется, что код в вопросе работает со мной (Linux-Ubuntu-16.04, gcc версия 5.4.0), при условии, что класс друга был заранее объявлен .

В поисках ответа я наткнулся на этот пост , который объясняет правильную технику создания класса друзей в глобальном пространстве имен и объясняет, почему его нужно объявить так, как он это делает. Это хорошая тема, потому что она ссылается на стандарт.

Как указывалось ранее, класс глобального пространства имен должен быть объявлен вперед , прежде чем его можно будет использовать в качестве класса друга для класса в пространстве имен.

0 голосов
/ 14 мая 2010

добавить предварительную декларацию, как показано ниже

namespace {  
  // anonymous namespace declaration
  class CBaseSD;
}

then your normal

friend class CBaseSD;// no need of ::

работает в CBase

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...