web-dev-qa-db-ja.com

異なる名前空間にまたがるフレンドクラス。それは可能ですか

C++のフレンド機能を使用しようとして問題が発生しました。私はこれらのインターフェースを持っています:

#pragma once
#include "Mesh3D.h"
#include <string>
namespace tools{
    namespace sysInput{
        class CGeometryManager3D
        {
        public:
            bool loadFromFile(render::CMesh3D& mesh, std::string filename);
            CGeometryManager3D(void);
            ~CGeometryManager3D(void);
        };

    };

};

そして

#pragma once
#include "GeometryManager.h"

class CGeometryManager3D;
namespace render{

    class CMesh3D
    {
    public:
        friend class tools::sysInput::CGeometryManager3D;
        CMesh3D(void);
        ~CMesh3D(void);
    };

};

何が起こっているのかわかりませんが、コンパイラー(Visual C++ 2008)によって多くのエラーがスローされます。 これを解決することは可能ですか?

編集:上記のコードは私の問題を示すためのモックコードです。あなたのソリューションはこのコードに対しては問題なく機能しますが、実際に実行すると、実際のコードは機能しませんでした。実際のコードはほぼ同じです。

#ifndef _ZELESTE_IO_GEOMETRY_MANAGER_H_
#define _ZELESTE_IO_GEOMETRY_MANAGER_H_

#include "ResourceLocationManager.h"
#include <string>
#include "../../render/C3DMesh.h"


namespace tools{
    namespace sysInput{ 
        class CGeometryManager
        {
        private:
            CGeometryManager(void);
            ~CGeometryManager(void);
            static CGeometryManager* m_instance;
        public:
            static CGeometryManager* getInstance();
            bool load3DGeometryFromFile(render::C3DMesh* mesh, const std::string filename);

        };
    };
};

#endif //_ZELESTE_IO_GEOMETRY_MANAGER_H_

そして

#ifndef _C3D_MESH_H_
#define _C3D_MESH_H_

#include "Mesh.h"
#include "../tools/io/GeometryManager.h"
#include <string>

namespace tools{
    namespace sysInput{
        class CGeometryManager;
    }
}

namespace render{
    class C3DMesh
        :public CMesh
    {
    public:
        friend class tools::sysInput::CGeometryManager;
        C3DMesh(void);
        ~C3DMesh(void);
    };

};
#endif // _C3D_MESH_H_

コンパイラは、「CMesh3D」がレンダーのメンバーではないというエラーを返します。繰り返しになりますが、どんな助けでも大歓迎です。 :)

編集2:各クラスの宣言と両方のクラスの独自の名前空間を転送することで解決しました。これは循環宣言で失敗するはずだと思いましたが、ようやく完全に機能します。

助けてくれてありがとう。

21
Killrazor

このようなものが少しうまく機能するかどうかを確認してください(今のところ、それらを単一のソースファイルにマージしました)。

#include <string>

namespace tools {
    namespace sysInput {
        class CGeometryManager3D;
    }
}

namespace render {   
    class CMesh3D
    {
    public:
        friend class tools::sysInput::CGeometryManager3D;
        CMesh3D(void);
        ~CMesh3D(void);
    };    
}

namespace tools {
    namespace sysInput{
        class CGeometryManager3D
        {
        public:
            bool loadFromFile(render::CMesh3D& mesh, std::string filename);
            CGeometryManager3D(void);
            ~CGeometryManager3D(void);
        };

    };    
}
28
Jerry Coffin