Q_COREAPP_STARTUP_FUNCTION со статическим методом члена класса

Мне нужно зарегистрировать мой класс, используя qRegisterMetaType() и хотел использовать Q_COREAPP_STARTUP_FUNCTION.

Я не хочу регистрировать это в main() потому что мне нужно это в (не статически) библиотеке.

void someUniqueMethodName()
{
qRegisterMetaType(MyClass*);
}

Q_COREAPP_STARTUP_FUNCTION(someUniqueMethodName)

У меня есть несколько случаев для этого, и я не хочу загрязнять корневое пространство имен. Компилятору не нужны несколько методов с одним и тем же именем, и я не хочу думать об уникальных именах методов каждый раз, когда добавляю новый.

Отсюда и метод статического члена в моих классах!

Но этот пример не компилируется:

class MyClass {
public:
// ...
static void registerMetaType();
}

с реализацией в файле .cpp:

MyClass::registerMetaType() {}

Q_COREAPP_STARTUP_FUNCTION(MyClass::registerMetaType)

Почему я не могу использовать статические методы-члены, и если это не правильный способ решить эту проблему, что будет лучше?

ОБНОВИТЬ
Сообщения об ошибках компилятора:

/path/to/myclass.cpp:183:1: error: no ‘void MyClass::registerMetaType_ctor_function()’ member function declared in class ‘MyClass’
Q_COREAPP_STARTUP_FUNCTION(MyClass::registerMetaType)
^
In file included from /path/to/qt5-5.6.0/include/QtCore/QtGlobal:1:0,
from /path/to/myclass.h:18,
from /path/to/myclass.cpp:15:
/path/to/myclass.cpp:183:1: error: qualified name does not name a class before ‘{’ token
Q_COREAPP_STARTUP_FUNCTION(MyClass::registerMetaType)
^
/path/to/myclass.cpp:183:1: error: invalid type in declaration before ‘;’ token
Q_COREAPP_STARTUP_FUNCTION(MyClass::registerMetaType)
^
/path/to/myclass.cpp:183:1: error: definition of ‘MyClass::registerMetaType_ctor_function_ctor_instance_’ is not in namespace enclosing ‘MyClass’ [-fpermissive]
/path/to/myclass.cpp:183:1: error: ‘static’ may not be used when defining (as opposed to declaring) a static data member [-fpermissive]
/path/to/myclass.cpp:183:1: error: ‘const int MyClass::registerMetaType_ctor_function_ctor_instance_’ is not a static member of ‘class MyClass’
/path/to/myclass.cpp:183:28: error: uninitialized const ‘MyClass::registerMetaType_ctor_function_ctor_instance_’ [-fpermissive]
Q_COREAPP_STARTUP_FUNCTION(MyClass::registerMetaType)

2

Решение

Я сообщил о запросе функции для Qt, чтобы добавить поддержку функций-членов:
https://bugreports.qt.io/browse/QTBUG-66902

Похоже, проблема в :: в статической функции-члене и использовании макросов.

В любом случае, альтернативное решение для преодоления «загрязняющего корневого пространства имен» и дублирующих символов состоит в использовании пространств имен:

namespace { // no duplicate symbol across units
namespace detail { // avoid "polluting" global namespace of this .cpp file

void registerMetaTypes() {
qRegisterMetaType(MyClass*);
}

Q_COREAPP_STARTUP_FUNCTION(registerMetaTypes)
} // namespace detail
} // anonymous namespace
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]