我正试图通过将某些功能声明为朋友来解决自定义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之外,我怎么能让它编译?
答案 0 :(得分:4)
似乎MSVC 2010看不到“Bar”和“::”之间的空格。
空格无关紧要::
意味着foo::bar
与foo ::bar
相同。
尝试在函数名称周围添加括号:
friend inline Bar (::qvariant_cast<Bar>)(const ::QVariant &v);