0

我试图通过将某些函数声明为朋友来解决自定义 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之外,我怎样才能让它编译?

4

1 回答 1

4

似乎 MSVC 2010 没有看到“Bar”和“::”之间的空格。

空格无关紧要,::含义foo::barfoo ::bar.

尝试在函数名称周围添加括号:

friend inline Bar (::qvariant_cast<Bar>)(const ::QVariant &v);
于 2012-11-19T18:02:48.987 回答