2014-10-30 38 views
1

我已经看到许多与此问题相关的问题,但仔细听从成员的建议后,我的问题仍然存在。代码很简单。我只有下面的头文件(“instrument.h”),其中包含了基类和模板类:C++中的模板继承和Xcode中未定义的符号

#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

您宣布两个InstrumentEquity默认的构造函数,但无处定义它们。

适当地改变它们的定义:

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

(和等效为Instrument

您也可以完全省略任何默认构造函数的声明,现在因为你没有申报任何两个其他的构造EquityInstrument,默认构造函数将自动生成。

+0

感谢您的回答,但不幸的是,这些选项都不起作用,不断得到相同的错误。 – Adam 2014-10-30 13:05:16

+0

@Adam您必须更改这两个类模板。查看我的编辑。 – Columbo 2014-10-30 13:11:17

+0

相应地改变了,甚至尝试了几种组合,仍然是相同的错误。 – Adam 2014-10-30 13:23:37