1

当我编译以下 c++ 代码时:

#include "ConstantList.h"

using namespace std;

int main() {

ConstantList* cl = new ConstantList();

//do something with cl

delete cl;
cl = NULL;

return 0;
}

编译器给了我错误:

Undefined symbols:
  "ConstantList::~ConstantList()", referenced from:
      _main in ccNfeeDU.o
  "ConstantList::ConstantList()", referenced from:
      _main in ccNfeeDU.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

我没有得到正确实例化对象的语法吗?我的 ConstantList.h 文件如下所示:

#ifndef ConstantList_h
#define ConstantList_h

#include <string>
#include "Token.h"


using namespace std;

class ConstantListTail;

class ConstantList {
public:
    ConstantList();
    ~ConstantList();

    std::string toString();

    void push_back(Token*);
    void push_back(ConstantListTail*);

private:
    Token* termString;
    ConstantListTail* constantListTail;
};



#endif

任何帮助是极大的赞赏!

4

2 回答 2

5

您的语法是正确的,因为您收到的是链接器错误,而不是编译器错误。此错误意味着您正在编译您的main没有 的来源ConstantList.cpp,或者没有引用的链接ConstantList.o

使用此命令编译应该可以修复错误:

g++ collect2.cpp ConstantList.cpp

(我假设带有您的main函数的文件被调用collect2.cpp)。

于 2013-02-22T17:28:44.677 回答
2

“未定义符号”表示您已声明标识符(在本例中为析构函数),并且已使用它,但据链接器所知,您尚未定义它

在某处添加定义,并确保编译后的版本位于链接器链接的文件之一中


重新“实例化语法”,不幸的是在 C++ 中没有专门的语法

相反,函数转换表示法用于构造函数调用

也许最接近纯实例化语法的是new表达式


回覆

using namespace std;

在头文件中:不要.

例如,标准库定义了一些名为distance. 包含标头的某些代码有自己的代码distance并发生名称冲突的可能性有多大?远高于零。

这并不意味着你永远不应该using namespace std;在头文件中拥有它,但你永远不应该在头文件的全局命名空间中拥有它。对于其他命名空间,要非常清楚它的作用,即提供所有标准库名称作为该命名空间的一部分。

于 2013-02-22T17:30:59.733 回答