1

Eclipse CDT を使用して、共有ライブラリ プロジェクトに常駐する抽象クラス 'Lexer' を作成しました。別の共有ライブラリ プロジェクトの「UTF8Lexer」に継承されます。これらのために、次のコードを含む UnitTest++ テスト プロジェクトを作成しました。

#include "UnitTest++.h"
#include "UTF8Lexer.h"
#include <fstream>

using namespace std;

programma::Lexer<UChar32, icu::UnicodeString>* getLexer(string sampleFile)
{
    string path = "../samples/" + sampleFile;

    ifstream* stream = new ifstream();
    stream->open (path.data());

    programma::UTF8Lexer l1(stream); //This line compiles fine.

    programma::UTF8Lexer* l2 = new  programma::UTF8Lexer(stream); // Error: "Type 'programma::UTF8Lexer' could not be resolved"

    return l2;
}

なぜ彼が l1 の宣言が好きで、l2 の宣言が嫌いなのか理解できません... 通常は具体的でないエラー メッセージは、私に多くの手がかりを与えません (私は C++ を初めて使用しますが、私は多くの作業を行いましたC# を使用し、大学でのコンピューター サイエンスのコースで C でいくつかのことを作成しました...)。実際に l1 宣言を処理するため、参照やインクルードが欠落している可能性はないと思います...しかし、同じソースファイル内に他のクラスを作成し、同じ方法でインスタンス化すると、すべてが機能します...

このチュートリアルを使用して、ライブラリを使用中のプロジェクトに接続したので、これで問題ありません。

私もこれについてたくさんグーグルで検索しましたが、結局のところ、この問題の特定の検索用語を見つけることは不可能であるか、ある種の特別なケースを見つけました...

上記のクラスからの抜粋を次に示します。

  • UTF8Lexer.h:

    #ifndef UTF8LEXER_H_
    #define UTF8LEXER_H_
    
    
    #include "unicode/unistr.h"
    #include "Lexer.h"
    #include <iostream>
    
    using namespace icu;
    
    namespace programma {
    
    class UTF8Lexer : public Lexer<UChar32, UnicodeString> {
    
    public:
    
        UTF8Lexer(std::istream* source);
    
        ~UTF8Lexer();
    ...
    
  • UTF8Lexer.cpp:

    #include "UTF8Lexer.h"
    
    namespace programma {
    
    programma::UTF8Lexer::UTF8Lexer(std::istream* source)
    {
    }
    
    programma::UTF8Lexer::~UTF8Lexer() {
    
    }
    ...
    
  • Lexer.h:

    #ifndef LEXER_H_
    #define LEXER_H_
    
    #include "Token.h"
    
    namespace programma {
    
    template<typename C, typename S> class Lexer {
    public:
    ...
    
4

2 に答える 2

0

問題の原因がわかりました。「UTF8Lexer」を「UTFLexer」に適切にエナミングすると、すべてが解決しました。しかし、数時間後、クラスのメンバーと同じ問題を抱えていました。この一見完全に機能していない Eclipse/CDT/GCC セットアップを破棄して数分後、私はプロジェクトのインデックスを再構築するというアイデアを思いつきました: プロジェクトを右クリックし、[インデックス] -> [再構築] を選択します。今では動作します。

于 2013-03-12T19:54:40.730 に答える
0

programma::UTF8Lexer l1(stream);は、おそらく として解析されますprogramma::UTF8Lexer l1(std::stream __Unnamed_Argument);。つまり、 という名前の関数の宣言ですl1using namespace std::これを修正するには削除します。

于 2013-03-11T14:53:31.707 に答える