Занятия в разных пространствах имен. Это возможно

У меня возникают проблемы при попытке использовать функцию друга 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» не является членом render. Опять же, любая помощь приветствуется. :)

редактировать 2: Я решил это, перенаправив объявление каждого класса и свое собственное пространство имен в обоих классах. Я думал, что это должно провалиться из-за циркулярной декларации, но в конце концов это сработало идеально

Спасибо всем за помощь.

 James McNellis02 окт. 2010 г., 01:46
Первый файл с именемGeometryManager.h и второй файл с именемMesh3D.h? Если это так, у вас есть круговая проблема включения.
 San Jacinto02 окт. 2010 г., 01:48
@ Джеймс, это была моя мысль.
 Killrazor03 окт. 2010 г., 12:16
Нет ... не появляется циркулярное включение. В A включает B и B включает A, вы решаете циклическое включение, перенаправляя объявление одного из предложений в другое, как я делал в своем коде.

Ответы на вопрос(2)

Решение Вопроса

работает ли что-то подобное немного лучше (на данный момент я объединил их в один исходный файл).

#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);
        };

    };    
}
 Arun02 окт. 2010 г., 04:30
Вероятно, точки с запятой после блоков пространства имен не требуются.
 Ben Voigt02 окт. 2010 г., 01:54
В настоящее время ждем новых голосов, но квалификация предварительной декларации с правильным сдерживанием пространства имен, безусловно, является правильным решением.
 Killrazor03 окт. 2010 г., 12:11
Я проверил, направив объявление CGeometryManager как tools :: sysInput :: CGeometryManager, но оно не сработало. Теперь это работает!

Я думаю, вам нужно удалить следующий код во втором файле:

#include "GeometryManager.h"

class CGeometryManager3D;

Первая строка вызывает циклическое включение, как следует из комментариев в вопросе;

Вторая строка объявляет совершенно нерелевантный класс в глобальном пространстве имен;

 Killrazor03 окт. 2010 г., 12:13
Нет, это не работает.

Ваш ответ на вопрос