0

特定の関数をフレンドとして宣言することにより、カスタムQtメタタイプのデフォルトのコンストラクターをパブリックにする必要があるという制限を回避しようとしています。

#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

MSVC2010では「バー」と「::」の間にスペースが表示されないようです。

デフォルトのctorを公開する以外に、どうすればコンパイルできますか?

4

1 に答える 1

4

MSVC 2010 では、「バー」と「::」の間のスペースが認識されないようです。

周囲のスペースは関係ありません。::意味foo::barは と同じfoo ::barです。

関数名の周りに括弧を追加してみてください:

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