我有一个类,我只希望客户端为每个进程创建一个对象。而不是单身,更好的方法(我相信)是告诉客户只在main()中创建它们。因此,自然的执行是将构造函数private和main()作为朋友。
它的工作原理如下:
class A { friend int main(int, char**); A() {} };
int main(int, char **) { A a; }
但是当我需要将A类放在命名空间中时它会中断:
namepace ns { class A { friend int main(int, char**); A() {} }; }
int main(int, char **) { ns::A a; }
问题是范围界定:编译器现在认为
friend int main
表示命名空间ns中名为main()的函数。所以真正的main()变得无关紧要。
所以问题是:如何解决这个问题?当然,我必须将A类放在命名空间中。
答案 0 :(得分:5)
使用“::
”来限定某些内容在全局命名空间中,即:
friend int ::main(int argc, char** argv);
答案 1 :(得分:5)
您需要在类定义之前在全局命名空间中声明main
,因为friend
声明只能在周围的命名空间中引入名称:
int main(int, char**);
并在名称空间中引用它时限定名称:
namepace ns { class A { friend int ::main(int, char**); A() {} }; }
// ^^