好友和命名空间

Friends and namespaces

本文关键字:命名空间 好友      更新时间:2023-10-16

我一直在和朋友一起做实验,遇到了一些我无法解释的事情

如果我将一个类声明为

 class MyClass: public QObject
 {
  Q_OBJECT
 public:
  friend int main(int,char**);
 private:
  MyClass(QObject *parent = 0);
 };

然后我可以在 main 中实例化一个 MyClass –

int main(int argc, char *argv[])
{
 QApplication a(argc, argv);
 MyClass*  = new MyClass;
 raiigui w;
 w.show();
 return a.exec();
}

但是,如果我将 MyClass 放在命名空间中 –

namespace MyNamespace
{
 class MyClass: public QObject
 {
  Q_OBJECT
 public:
  friend int main(int,char**);
 private:
  MyClass(QObject *parent = 0);  
 };
}

我现在无法实例化我的类

MyNamespace::MyClass mc = new MyNamespace::MyClass;

谁能解释为什么会这样?

谢谢

friend int main(int,char**);

namespace MyNamespace中声明main。要从另一个命名空间声明一个友元函数,你必须完全指定命名空间,这反过来又需要向前声明main

int main(int argc, char *argv[]);
namespace MyNamespace
{
    class MyClass: public QObject
    {
        friend int ::main(int,char**);
        //         ^^^^^^
    private:
        MyClass(QObject *parent = 0);  
    };
}
int main(int argc, char *argv[])
{
     MyNamespace::MyClass* mc = new MyNamespace::MyClass;
}