Classes de amigos em diferentes namespaces. Isso é possível
Estou tendo problemas para tentar usar o recurso de amigo do C ++. Eu tenho estas interfaces:
#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);
};
};
};
e
#pragma once
#include "GeometryManager.h"
class CGeometryManager3D;
namespace render{
class CMesh3D
{
public:
friend class tools::sysInput::CGeometryManager3D;
CMesh3D(void);
~CMesh3D(void);
};
};
Não sei o que está acontecendo, mas muitos erros são gerados pelo compilador (Visual C ++ 2008).É possível resolver isso?
editar: O código acima é um código simulado para mostrar meu problema. Sua solução funciona bem para esse código, mas quando eu coloquei em prática o meu código real não funcionou. O código real é quase o mesmo:
#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_
e
#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_
O compilador retorna um erro que diz "CMesh3D" não é um membro da renderização. Novamente, qualquer ajuda é bem-vinda. :)
editar 2: Eu o resolvi encaminhando a declaração de cada classe e seu próprio espaço para nome nas duas classes. Eu pensei que isso deveria falhar por declaração circular, mas finalmente funcionou perfeitamente.
Obrigado a todos pela ajuda.