C ++:无法用new实例化我的类

时间:2013-03-11 14:41:37

标签: c++ types

使用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声明...但是如果我在同一个源文件中创建一些其他类并以相同的方式实例化它,一切正常...

我使用this tutorial将库连接到他们的使用项目,所以这应该没问题。

我也搜索过很多内容,但事实证明,要么找不到具体的搜索条件,要么找到某种特殊情况......

以下是上述课程的一些摘录:

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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