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() {
    
    }
    ...
    
  • 词法分析器.h:

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

2 回答 2

0

programma::UTF8Lexer l1(stream);可能被解析为programma::UTF8Lexer l1(std::stream __Unnamed_Argument);,即一个名为 的函数的声明l1。删除using namespace std::以解决此问题。

于 2013-03-11T14:53:31.707 回答
0

我发现是什么导致了我的麻烦:正确地将 'UTF8Lexer' 命名为 'UTFLexer' 解决了所有问题。但是,几个小时后,我和一位班员也遇到了同样的问题。在处理这个看似完全失效的 Eclipse/CDT/GCC 设置几分钟后,我有了重建项目索引的想法:只需右键单击项目,选择“索引”->“重建”。现在它起作用了。

于 2013-03-12T19:54:40.730 回答