在提供功能时出错

时间:2012-11-19 17:57:30

标签: c++ visual-studio-2010

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

1 个答案:

答案 0 :(得分:4)

  

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

空格无关紧要::意味着foo::barfoo ::bar相同。

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

friend inline Bar (::qvariant_cast<Bar>)(const ::QVariant &v);