我试图通过将某些函数声明为朋友来解决自定义 Qt 元类型的默认 ctor 必须是公共的限制。
#include <QMetaType>
class QVariant;
template<typename T> inline T qvariant_cast(const QVariant &); // from qvariant.h
namespace foo
{
class Bar
{
private:
Bar(){};
friend void *::qMetaTypeConstructHelper<Bar>(const Bar *t); // works
friend inline Bar ::qvariant_cast<Bar>(const ::QVariant &v); // error C4430: missing type specifier
};
} // namespace foo
Q_DECLARE_METATYPE(foo::Bar)
void main()
{
QVariant v;
v.value<foo::Bar>();
}
注释掉标记的行时,出现以下错误,这是预期的:
1>[...]\qvariant.h(577): error C2248: 'foo::Bar::Bar' : cannot access private member declared in class 'foo::Bar'
但是将函数声明为朋友不起作用:
Bar.cpp(13): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
似乎 MSVC 2010 没有看到“Bar”和“::”之间的空格。
除了公开默认的ctor之外,我怎样才能让它编译?