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: ...