我的私有构造函数出现问题如下:
Lane.hpp:
namespace sim_mob
{
class B
{
friend class A;
private:
B(int){}
};
}
xmll.hpp:
#include"Lane.hpp"
namespace geo
{
class A
{
public:
A()
{
sim_mob::B b(2);
}
};
}
main.cpp中:
#include"xmll.hpp"
int main()
{
geo::A a;
return 0;
}
命令: $ g ++ main.cpp
In file included from main.cpp:2:0:
Lane.hpp: In constructor ‘geo::A::A()’:
Lane.hpp:10:5: error: ‘sim_mob::B::B(int)’ is private
xmll.hpp:9:23: error: within this context
关键是如果我在构造函数中没有任何参数,我就不会收到此错误。我可以知道为什么我会得到这个以及如何解决它? 非常感谢
答案 0 :(得分:6)
在课程sim_mob::B
中,你会成为一个班级sim_mob:A
,但你希望这种友谊延伸到geo::A
,而这显然不会。geo::A
。要解决此问题,您需要在成为朋友之前声明namespace geo { class A; }
namespace sim_mob
{
class B
{
friend class geo::A;
private:
B(int){}
};
}
:
sim_mob::B b();
我猜,它与默认构造函数“一起工作”的事实是你宁愿声明一个函数而不是实例化一个对象:
{{1}}
是一个函数声明。如果你不使用括号,你应该得到一个关于默认构造函数不存在的错误,或者,如果你实际声明它,则不能访问。
答案 1 :(得分:3)
转发声明:
namespace geo{
class A;
}
在B班:
friend class geo::A;
答案 2 :(得分:0)
friend class A;
个朋友类A
,即sim_mob::A
,而不是geo::A
。您需要声明该类,然后使用完全限定名称:
namespace bar { struct bar; }
namespace foo {
struct foo {
private:
friend struct bar::bar;
explicit foo(int) {}
};
}
namespace bar {
struct bar {
bar() { foo::foo x(42); }
};
}