5

以前のQ&A(別の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でコンパイルしています。

4

2 に答える 2

2

質問の下のコメントのいくつかで述べたように、フレンド クラスがforward-declaredである場合、質問のコードは私 (Linux-Ubuntu-16.04、gcc バージョン 5.4.0) で動作するようです。

答えを求めて、グローバル名前空間のフレンド クラスを作成するための適切なテクニックと、そのように宣言する必要がある理由の両方を説明するこの投稿に出くわしました。標準を参照しているので、それは素晴らしいスレッドです。

前述のように、グローバル名前空間のクラスは、名前空間内のクラスのフレンド クラスとして使用する前に、前方宣言する必要があります。

于 2019-06-07T20:00:25.927 に答える
-1

以下のように前方宣言を追加します

名前空間 {  
  // 匿名名前空間宣言
  クラス CBaseSD;
}

それからあなたの通常

フレンド クラス CBaseSD;// :: は必要ありません

CBaseで動作します

于 2010-05-14T19:34:36.690 に答える