3

このいまいましいエラーはよく知られている問題です

'{' トークンの前に期待されるクラス名

さて、一生懸命働いてグーグルで調べたにもかかわらず、このエラーを解決できませんでした。ごめん。これが私の最後の岸です。

私のプロジェクトの ui.cpp では、次のことを行います。

#include "wfqueue_proxy_factory.hpp"

OK、これは私のコンパイラでこのばかげたエラーを引き起こします:

wfqueue_proxy_factory.hpp:29 からインクルードされたファイルで、ui.cpp:28 から: wfqueue_manager_proxy.hpp:42: エラー: '{' トークンの前に期待されるクラス名

私のプロジェクトには 3 つのクラスがあります。

// wfqueue_proxy_factory.hpp
#ifndef _WFQUEUE_PROXY_FACTORY_HPP
#define _WFQUEUE_PROXY_FACTORY_HPP
#include "wfqueue_manager_proxy.hpp"
// ...
class WFQueueProxyFactory {
//...
};
#endif

2番

// wfqueue_manager_proxy.hpp
#ifndef _WFQUEUE_MANAGER_PROXY_HPP
#define _WFQUEUE_MANAGER_PROXY_HPP
#include "workflow.hpp"
#include "wfqueue.hpp"
// ...
class WFQueueManagerProxy : public WFQueue { // This is the problem (line 42)
//...
};
#endif

三番

// wfqueue.hpp
#ifndef _WFQUEUE_HPP
#define _WFQUEUE_HPP
#include "workflow.hpp"
class WFQueue {
// ...
};
#endif

私が使用していることに注意してください。すべてのクラスの } の後、この問題を探してプロジェクトのすべてのヘッダーをチェックアウトしましたが、; が続かないクラスは見つかりませんでした。閉じ括弧の後。これは、単純なクラス (クラスから派生したものではなく、単純なクラス) である workflow.hpp に有効です。

WFQueue はある種のインターフェースです。私はこのパターンを他のクラスでも使用していますが、それらは機能します。WFQueue にはいくつかの仮想純粋メソッドが含まれています...とにかく問題はここにあるべきではありません....これは、他のクラスと別の「インターフェイス」クラスを使用し、それらが正常に動作するためだと思います。

これを行うと、このエラーは消えます。

// wfqueue_manager_proxy.hpp
#ifndef _WFQUEUE_MANAGER_PROXY_HPP
#define _WFQUEUE_MANAGER_PROXY_HPP
#include "workflow.hpp"
#include "wfqueue.hpp"
// ...
class WFQueueManagerProxy {
//...
};
#endif

この問題を解決する方法が本当にわかりません...助けてください。ありがとうございました

4

5 に答える 5

4

コードでプリプロセッサを実行する必要がありますが、コンパイルして結果を調べる必要はありません。これを行うには、失敗したコンパイルを実行するコマンドをコピーします。ほとんどのコンパイラでは、-o outfileオプションを削除して次のようなものを追加し-Eます (前処理のみを行うフラグについては、コンパイラのドキュメントを参照してください)。

コンパイラは、すべての #include などを解決した翻訳単位全体を (stdout で) 出力するため、何が欠けているかを明確に確認できます (エラー行に一致するコード行を検索し、検索してどの宣言を確認するかを調べます)。探す)。それでも問題が明確でない場合は、前処理された出力をファイルに書き込み、それをコンパイルしてみてください。次に、前処理されたソースを微調整して、修正に何が必要かを確認できます。

于 2010-11-28T13:13:43.160 に答える
3

ちょっとした推測:あなたのエラーは

class WFQueueManagerProxy : public WFQueue { // This is the problem (line 42)
//...
};

{の前にクラス名が必要です。WFQueueしたがって、コンパイラはそれがクラスであることを認識していないと思います。その定義が含まれていますか? つまり、おそらく wfqueue.hpp で、クラスに名前が付けられWfQueueているか、他の方法で異なっているのでしょうか?

于 2010-11-28T12:55:40.190 に答える
1

それは決して起こらなかったことです...私の神は申し訳ありません...私の仮想マシンのバックアップディスクが元のディスクと衝突したようです。プロジェクトを仮想マシンで実行し、2時間前にバックアップを作成しましたが、おそらく何かが台無しになりました...調整すると、仮想マシンはコンパイルする正しいフォルダーと正しいファイルを見つけることができます。それは驚くべきことであり、明らかでした。olsファイルg ++は、以前のバージョンが間違いでいっぱいになった場所でコンパイルしようとしました...これはそのバグの1つでした...ガードヘッダーが繰り返されました。Icecrimeは正しかった...ファイル内の繰り返しを探したにもかかわらず、この問題を修正しなかった以前のバージョンでは、貼り付けてガードヘッダーを変更するのを忘れたファイルがいくつかありました。何卒ご理解とご協力を賜りますようお願い申し上げます。申し訳ありませんが、私のマシンでこの非常に奇妙な仮想ディスクの衝突に気づかなかったのです。

于 2010-11-28T13:23:43.147 に答える
1

問題は、誤った名前のインクルード ガードにある可能性があります。ファイルごとに本当に一意かどうかを確認してください。WFQueueコンパイル中に の定義を無効にするようにしたようですWFQueueManagerProxy

于 2010-11-28T12:56:48.897 に答える