C ++中的模板继承和Xcode上的未定义符号

时间:2014-10-30 12:54:20

标签: templates inheritance

我已经看到许多与此问题相关的问题,但在仔细听取了会员的建议后,我的问题仍然存在。代码很简单。我只有以下头文件(" 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文件,但是模板的定义必须保存在头文件中,这样也可能会崩溃。

提前致谢

1 个答案:

答案 0 :(得分:1)

您声明了InstrumentEquity的默认构造函数,但未定义它们。

适当改变他们的定义:

public:
    Equity() = default; // Or {} in pre-C++11
//           ^^^^^^^^^

(等同于Instrument

您现在也可以完全省略任何默认构造函数的声明,因为您没有在EquityInstrument中声明任何其他构造函数,并且将自动生成默认构造函数。 / p>