2011-06-28 19 views
4

lupdate v4.7.2を使用して非常に異常なエラーが発生しました。エラーメッセージが表示されましたlupdateエラー:不明な名前空間/クラスで修飾する

module/foo.cpp:6: Qualifying with unknown namespace/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には、メインの空の機能があります。

コードはコンパイルされます(私がここで生成したかもしれないコピーパスタの間違いがない限り)ので、構文は基本的に正しいです。

答えて

6

答えは、lupdateがfoo.cppを解析中にヘッダファイルfoo.hを見つけることができなかったことです。次の行で.PROファイルを削除した拡張問題:しかし

INCLUDEPATH += . 

、まだ私を悩ます何ビットは、コンパイラがコードをコンパイルすることができなかったということですが、どういうわけか、qmakeのはへ-I.を追加しましたコンパイラオプション。だからこそ私はインクルードファイルの問題を早期に考えずに、数時間かけてこれを困惑させたのです。誰でもこれがデフォルトの動作かどうか知っていますか?また、lupdateが適切なエラーメッセージを表示しないのはなぜですか?

+2

私は同じ問題を抱えていた、あなたのソリューションはすぐに私のために働いていないが、正しい方向に私を指摘した。 [this](https://bugreports.qt-project.org/browse/QTBUG-24587?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel)によると、バグレポートは、問題の根本lupdateが現在のディレクトリを基準にインクルードファイルを検索するということです。私の場合は、現在のディレクトリが '。/ translations'だったので、' INCLUDEPATH + = ../src'を追加しなければなりませんでした。 – Wutz

+0

@Wutzありがとう。あなたのコメントはビルドエラーを解決するのにさらに役立ちました。 –

1

私はちょうど別のシナリオでこの同じメッセージを受け取りました。私の場合、問題はfoo.cpp#include "foo.h"の代わりに#include <foo.h>を含んでいたことです。両方のファイルがグローバルインクルードパスにないディレクトリであるため、lupdateは、インクルードに引用符がないため、そのディレクトリを見ても気にしませんでした。適切な区切り文字に切り替えると、lupdateとなりました。

2

私のケースでは、lupdateは列挙型MyEnumを解析できませんでした:int {};クラス宣言に達しませんでした。 Qt 5.7.1では、lupdateは列挙型の型指定子をまだ理解していません。

+0

これは私の問題でした。かなり迷惑な。回避策を見つけましたか? –

0

Ubuntu 12.04システムでQt 5.4.1を使用してもこのエラーメッセージが表示されています。

しかし、エラーの理由は異なります。 "lupdate"は、少なくともネームスペースにカプセル化された関連する前方宣言を使用する場合、C++の強力な列挙型に問題があるようです。

私は関連のヘッダファイルに次のようなものを使用してい

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

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

用語「列挙型クラス」のマルコを使用することによって回避することができ、「LUPDATE」の問題点:

#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 
0

私のケースでは、実際のクラス宣言の前に、奇妙な(しかし、私は推測している)形式の型宣言が構造体にありました。これにより、lupdateはクラスをスキップし、 "unqualified"という警告メッセージが表示されました。コードは、この(;-)で開始する鉱山ではなかった)ように見えた:QVarLengthArray<struct coords_t>からstruct取り外し

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

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

class LogsDialog : public QDialog 
{ 
    Q_OBJECT 
    ... 
} 

警告を解決しました。クラス内の構造体宣言を移動しました。私は両方をした:

関連する問題