Clases de amigos en diferentes espacios de nombres. Es eso posible

Tengo problemas para intentar usar la función de amigo de C ++. Tengo 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);
        };

    };

};

y

#pragma once
#include "GeometryManager.h"

class CGeometryManager3D;
namespace render{

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

};

No sé qué está sucediendo, pero el compilador arroja muchos errores (Visual C ++ 2008).¿Es posible resolver esto?

editar: El código anterior es un código simulado para mostrar mi problema. Su solución funciona bien para este código, pero cuando puse en práctica mi código real no funcionó. El código real es casi el mismo:

#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_

y

#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_

El compilador devuelve un error que dice "CMesh3D" no es miembro de render. De nuevo, cualquier ayuda es bienvenida. :)

editar 2: Lo resolví enviando la declaración de cada clase y su propio espacio de nombres en ambas clases. Pensé que esto debería fallar por declaración circular, pero finalmente funciona perfectamente.

Gracias a todos por la ayuda.

Respuestas a la pregunta(2)

Su respuesta a la pregunta