特定の関数をフレンドとして宣言することにより、カスタム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を公開する以外に、どうすればコンパイルできますか?