Ошибка lupdate: квалификация с неизвестным пространством имен / классом - PullRequest
9 голосов
/ 28 июня 2011

Я столкнулся с очень странной ошибкой при использовании lupdate v4.7.2. Я получил сообщение об ошибке

module / foo.cpp: 6: Квалификация с неизвестным пространством имен / class :: foo

для пары классов в проекте с приблизительно 50 классами. Я свел проблему к простому примеру:

SRC / project.pro:

QT       += core
TARGET = test
TEMPLATE = app

SOURCES += main.cpp \
           screen.cpp

HEADERS += screen.h

TRANSLATIONS += de.ts

SRC / модуль / foo.h:

namespace sp {
class foo {
    initWidgets();
};
} // namespace sp

SRC / модуль / foo.cpp:

#include <QString>
#include "module/foo.h"

namespace sp {
    foo::initWidgets() {
    QString bar = tr("bar");
}
} // namespace sp

main.cpp содержит пустую функцию main.

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

Ответы [ 5 ]

8 голосов
/ 28 июня 2011

Ответ состоял в том, что lupdate не смог найти заголовочный файл foo.h при анализе foo.cpp.Расширение файла .pro следующей строкой устранило проблему:

INCLUDEPATH += .

Тем не менее, меня немного беспокоит то, что компилятор не смог скомпилировать код, но каким-то образом qmake добавил -I. к настройкам компилятора.Вот почему я раньше не думал о проблеме с включаемым файлом и потратил пару часов на то, чтобы разобраться в этом.Кто-нибудь знает, это поведение по умолчанию?Также: почему lupdate не выдает соответствующее сообщение об ошибке?

4 голосов
/ 05 января 2017

В моем случае lupdate не смог разобрать enum MyEnum: int {}; линии и не удалось достичь объявления класса. Qt 5.7.1, lupdate все еще не понимает спецификаторы типов для перечислений.

2 голосов
/ 22 декабря 2017

В моем случае было странное (но я полагаю, юридически) отформатированное объявление типа в структуре перед фактическим объявлением класса. Это заставило lupdate пропустить класс и привело к «неквалифицированному» предупреждению. Код выглядел так (не мой для начала ;-)):

struct coords_t {
  double x, y;
  ...
};

struct plotsCollection {
  QVarLengthArray<struct coords_t> coords;  // problem right here
  ...
};

class LogsDialog : public QDialog
{
  Q_OBJECT
  ...
}

Удаление struct из QVarLengthArray<struct coords_t> устранило предупреждение. Так же как и перемещение объявлений структуры внутри класса. Я сделал оба:)

2 голосов
/ 25 июля 2017

Я также видел это сообщение об ошибке при использовании Qt 5.4.1 в системе Ubuntu 12.04.

Но причина ошибки была в другом.«lupdate», кажется, имеет проблемы с сильными перечислениями C ++ - 11, по крайней мере, при использовании связанных предварительных объявлений, инкапсулированных в пространство имен.

Я использую что-то подобное в связанном заголовочном файле:

namespace outer {
namespace other {
  enum class MyEnum : int;
} // namespace outer::other

namespace inner {
   class MyClass {
     //...
   };
} // namespace outer::inner
} // namespace outer

Проблему с «lupdate» можно обойти, используя marco для термина «enum class»:

#ifndef ENUM_CLASS
#define ENUM_CLASS enum class
#endif

namespace outer {
namespace other {
  ENUM_CLASS MyEnum : int;
} // namespace outer::other

namespace inner {
   class MyClass {
     //...
   };
} // namespace outer::inner
} // namespace outer
1 голос
/ 09 мая 2016

Я только что получил это же сообщение в другом сценарии. В моем случае проблема заключалась в том, что foo.cpp содержал #include <foo.h> вместо #include "foo.h". Поскольку оба файла представляли собой каталог, которого нет в глобальном пути включения, lupdate не стал искать в этом каталоге из-за отсутствия кавычек во включении. Переход на правильное включение разделителей сделал lupdate счастливым.

...