Reputation: 403
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
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