Я пытаюсь обойти ограничение, заключающееся в том, что ctor по умолчанию для пользовательского мета-типа 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
Похоже, что MSVC 2010 не видит промежутка между «Бар» и «::».
Кроме того, как сделать общедоступный ctor общедоступным, как я могу получить его для компиляции?
Похоже, что MSVC 2010 не видит промежутка между «Бар» и «::».
Пространства не имеют значения вокруг ::
имея в виду foo::bar
такой же как foo ::bar
,
Попробуйте добавить круглые скобки вокруг имени функции:
friend inline Bar (::qvariant_cast<Bar>)(const ::QVariant &v);
Других решений пока нет …