6

我有一个类,我只希望客户为每个进程创建一个对象。除了单例,更好的方法(我相信)是告诉客户只在 main() 中创建它们。因此,一个自然的强制措施是将构造函数设为私有,并将 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 类放在命名空间中。

4

2 回答 2

6

您需要main在类定义之前在全局命名空间中声明,因为friend声明只能在周围的命名空间中引入名称:

int main(int, char**);

并在命名空间内引用它时限定名称:

namepace ns { class A { friend int ::main(int, char**); A() {} }; }
//                                 ^^
于 2013-01-29T12:28:57.420 回答
5

使用 " ::" 将某些东西限定为在全局命名空间中,即:

friend int ::main(int argc, char** argv);
于 2013-01-29T12:21:42.490 回答