当我编译以下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
非常感谢任何帮助!
答案 0 :(得分:5)
您的语法是正确的,因为您收到链接器错误,而不是编译器错误。此错误表示您正在编译main
而没有ConstantList.cpp
的来源,或者在没有引用ConstantList.o
的情况下进行链接
使用此命令进行编译应修复错误:
g++ collect2.cpp ConstantList.cpp
(我假设您main
函数的文件名为collect2.cpp
}。
答案 1 :(得分:2)
“未定义的符号”表示您已声明了标识符(在本例中为析构函数),并且已使用它,但就链接器知道您尚未定义它而言
在某处添加定义,并确保已编译的版本位于链接器链接的文件之一
中re“用于实例化的语法”,遗憾的是在C ++中没有专门的语法
而是功能强制转换表示法用于构造函数调用
您可能最接近纯实例化语法的是new
表达式
RE
using namespace std;
在标题文件中:不要。
例如,标准库定义了一个名为distance
的东西。包含标题的某些代码有哪些机会拥有自己的distance
,并获得名称冲突?远高于零。
这并不意味着你不应该在头文件中有using namespace std;
,但是你不应该在头文件中的全局命名空间中拥有它。对于其他名称空间,请非常了解它的作用,即提供所有标准库名称作为该名称空间的一部分。