user1414413
user1414413

Reputation: 403

Friends and namespaces

I have been experimenting with friends and have come across something that I cannot explain

If I declare a class as

 class MyClass: public QObject
 {
  Q_OBJECT

 public:
  friend int main(int,char**);

 private:
  MyClass(QObject *parent = 0);

 };

Then I can instantiate a MyClass in main –

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

However, if I place MyClass inside a namespace –

namespace MyNamespace
{
 class MyClass: public QObject
 {
  Q_OBJECT

 public:
  friend int main(int,char**);

 private:
  MyClass(QObject *parent = 0);  
 };
}

I cannot now instantiate MyClass

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

Could anybody explain why this is?

Thanks

Upvotes: 1

Views: 54

Answers (1)

Anton Savin
Anton Savin

Reputation: 41301

friend int main(int,char**); declares main in namespace MyNamespace. To declare a friend function from another namespace you have to fully specify the namespace, and that in turn requires main to be forward-declared:

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;
}

Upvotes: 2

Related Questions