У QtCreator есть некоторые проблемы с моделью кода при использовании некоторых необычных функций C ++ 11 в проекте C ++ / Qt. В моем случае: шаблонный псевдоним, как показано ниже:
template<class T> using Ptr = QSharedPointer<T>;
QSharedPointer<SomeClass> myPtr = ...;
myPtr->... // will complete
Ptr<SomeClass> myPtr = ...; // not even parsed as a type...
myPtr->... // won't complete
Поэтому я подумал о том, чтобы просто Ptr
определение когда QtCreator анализирует файл, но, конечно, используйте хороший шаблонный синтаксис псевдонимов когда компилятор анализирует файл. Что-то вроде:
#ifdef QT_CREATOR
# define Ptr QSharedPointer
#else
template<class T> using Ptr = QSharedPointer<T>;
#endif
Помещение определения макроса в файл .pro с помощью DEFINES += -D...
не будет работать, так как QtCreator достаточно умен, чтобы использовать их в модели кода (что, конечно, хорошо). Также, QMAKE_CXXFLAGS += -D...
анализируется правильно (к сожалению).
Как я могу «обмануть» QtCreator, что есть определенный макрос, но (для компилятора) его нет (или наоборот)?
PS: я использую самую последнюю версию (2.7), а также попробовал 2.6.
Следующее работает, чтобы обмануть QtCreator по поводу определения макроса.
В файле проекта .pro я добавил следующую строку:
QMAKE_CXX = $${QMAKE_CXX} -D_IS_BEING_COMPILED
Это означает, что макрос _IS_BEING_COMPILED
будет определено. Но QtCreator (по крайней мере, версия 2.7) не анализирует содержимое QMAKE_CXX
для флагов (думаю, на то есть веские причины). Итак: QtCreator не видит этот макрос, но при компиляции он есть. Таким образом, ветвь препроцессора, как это, сделает работу:
#ifdef _IS_BEING_COMPILED
template<class T> using Ptr = QSharedPointer<T>;
#else
# define Ptr QSharedPointer
# error `Ptr` is a macro, but it should not!
#endif
Теперь QtCreator использует обходной путь для макросов, чтобы ввести псевдоним, который не идеален, но поскольку взломана только IDE, а не сама база кода, это нормально. QtCreator будет анализировать экземпляры Ptr
сейчас, а также полные члены.
Других решений пока нет …