链接错误与定义的析构函数

时间:2016-03-07 03:53:16

标签: c++

我在SO上搜索了许多未解析的外部符号(lnk2019)问题,其中大多数是有人忘记将构造函数定义放在.cpp文件或某些.cpp中的问题文件未包含在构建问题中。

链接器给了我一些错误,说我有一个未解决的外部:

//error was on NotationInstrument.obj
iNotationInstrument<class Notation::NotationTrack>::~iNotationInstrument<class
Notation::NotationTrack>

(我也有一些LNK2001错误。这是另一个'未解决的外部符号'错误)

然而,这个析构函数是定义的。由于它是接口的析构函数,派生类(NotationInstrument)有一个析构函数可以覆盖基类的析构函数。 NotationInstrument析构函数已定义。

NotationInstrument.h

#include "iNotationInstrument.h"
#include "NotationTrack.h"
#include <vector>

namespace Notation
{

    class NotationInstrument : public iNotationInstrument<NotationTrack>
    {
    public:
        NotationInstrument();
        ~NotationInstrument();

        std::vector<NotationTrack> getTracks() override ;
    private:
        std::vector<NotationTrack> tracks;

    }; // end of class "NotationInstrument"

};

NotationInstrument.cpp

#include "NotationInstrument.h"
//i've included the following just to be sure (for now, while debuggin)
#include "iNotationInstrument.h"
#include "iNotationTrack.h"
#include "NotationTrack.h"

namespace Notation
{

    NotationInstrument::NotationInstrument(){}
    NotationInstrument::~NotationInstrument(){}; //here is the destructor     

    std::vector<NotationTrack> NotationInstrument::getTracks()
    {
        return tracks;
    };  

};

iNotationInstrument.cpp

#include <vector>

template <class NotationTrackTemplate>
class iNotationInstrument
{
public:
    //iNotationInstrument();
    virtual ~iNotationInstrument() =0 ;
private:
    virtual std::vector<NotationTrackTemplate> getTracks() =0 ;

};

关于链接器错误的其他SO问题,我已经检查以确保所有相关文件都包含在构建中。

(我没有发布NotationTrack.h / .cpp和iNotationTrack.h来将问题保持在最低限度。但如果你愿意,我可以发布它们。)

问题:如果~NotationInstrument()重写~iNotationInstrument()并且声明和定义它,为什么我会收到此链接器错误?

编辑有关此内容的重复内容:我已经在SO上阅读了超过20篇关于此未解决的外部错误的帖子。但我仍然无法理解为什么我会得到一个未解决的外部因为我认为已定义的东西。我知道我错了,因为我得到了这个错误。我只是找不到原因。我尝试了 Matthew James Briggs的答案,但我也遇到了同样的错误。

2 个答案:

答案 0 :(得分:1)

我认为问题出在这里

virtual ~iNotationInstrument() =0 ;

您不能拥有纯虚拟析构函数。将其更改为

virtual ~iNotationInstrument() {}

它定义了内联的析构函数。

编辑:我想,你可以拥有一个纯虚拟析构函数,但你必须定义它。

答案 1 :(得分:0)

这两个都不正确,只需默认即可:

virtual ~iNotationInstrument() = default;