我已经看到许多与此问题相关的问题,但在仔细听取了会员的建议后,我的问题仍然存在。代码很简单。我只有以下头文件(" instrument.h"),其中包含基类和模板类:
#include <stdio.h>
#include <string>
using namespace std;
class Instrument
{
public:
Instrument();
virtual void print() const = 0;
};
template <class parameter> class Equity : public Instrument
{
public:
Equity();
virtual void print() const;
};
现在,在main.cpp的主函数中,我只执行以下操作:
#include "instrument.h"
#include <iostream>
int main() {
Equity<double> pb;
return 0;
}
好吧,我得到了一个众所周知的错误:
Undefined symbols for architecture x86_64:
"Equity<double>::Equity()", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我已经在构建设置中将C ++标准库更改为libstdc ++,也更改为默认编译器,依此类推。我的项目设置有问题吗?可能是模板错误地实现了吗?我在想我也应该有一个instrument.cpp文件,但是模板的定义必须保存在头文件中,这样也可能会崩溃。
提前致谢
答案 0 :(得分:1)
您声明了Instrument
和Equity
的默认构造函数,但未定义它们。
适当改变他们的定义:
public:
Equity() = default; // Or {} in pre-C++11
// ^^^^^^^^^
(等同于Instrument
)
您现在也可以完全省略任何默认构造函数的声明,因为您没有在Equity
和Instrument
中声明任何其他构造函数,并且将自动生成默认构造函数。 / p>