重载.h文件中的'+'运算符,链接器错误

时间:2013-12-16 21:02:15

标签: c++ operator-overloading linker-errors

我无法重载+运算符,我不知道为什么。 我尝试了很多解决方案,但我没有设法解决这个问题。 (运营商+ =工作正常)

我不明白。你能帮忙吗?

我收到错误:

  

LNK2019:未解析的外部符号“public:__ thishisall   Zbior :: Zbior(Zbior const&)类“   (?? 0?$ Zbior @ H @@ QAE @ ABV0 @@ Z)在函数“public:class”中引用   Zbior __thiscall Zbior :: operator +(类Zbior const&)“   (24 H $ Zbior 3 H @@ QAE?AV0 @ @@ ABV0 Z)

当我更改方法的返回对象时,问题不存在: Zbior算子+(const Zbior& other)

return Zbior<T>();

我的.h文件是:

template<class T>
class Zbior
{
public:
    Zbior(void);
    ~Zbior(void);
    void dodajElement(T elem);
    Zbior<T>(vector<T> elementyZbioru);
    Zbior<T>(Zbior<T> const &other);     
    Zbior<T>& operator+=(Zbior<T> const &other);

    Zbior<T>  operator+ (const Zbior<T> &other)
    {
        vector<T> otherVec = other.elementyZbioru;
        vector<T> thisVec = elementyZbioru;
        Zbior<T> wyjZbior = Zbior<T>();
        for (vector<T>::iterator p = otherVec.begin(); p != otherVec.end(); ++p)
        {
            wyjZbior.dodajElement(*p);
        }
        for (vector<T>::iterator p = thisVec.begin(); p != thisVec.end(); ++p)
        {
            wyjZbior.dodajElement(*p);
        }


        return Zbior<T>(wyjZbior);
    }
private:
    vector<T> elementyZbioru;

};

我的.cpp文件是:

#include "Zbior.h"

template<class T>
Zbior<T>::Zbior(void)
{
}

template<class T>
Zbior<T>::~Zbior(void)
{
}

template<class T>
Zbior<T>::Zbior(vector<T> elementyZbioru)
{
    this->elementyZbioru = elementyZbioru;
}

template<class T>
void Zbior<T>::dodajElement(T  elem){
    this->elementyZbioru.push_back(elem);
}
template<class T>
Zbior<T>& Zbior<T>::operator+=(Zbior<T> const &inny){

    vector<T> innyElementyZbioru = (inny.elementyZbioru);

    for (vector<T>::iterator p = innyElementyZbioru.begin(); p != innyElementyZbioru.end(); ++p)
    {
        dodajElement(*p);
    }
    return *this;
}

班级的消息:

#include "stdafx.h"
#include "Zbior.cpp"
#include "Zbior.h"


int _tmain(int argc, _TCHAR* argv[])
{
    Zbior<int> zb1 = Zbior < int>();
    zb1.dodajElement(1);
    zb1.dodajElement(1312);



    Zbior<int> zb2 = Zbior < int>();
    zb2.dodajElement(21);
    zb2.dodajElement(21312);

    //zb1 += zb2;
    Zbior<int> zb = zb1 + zb2;


    //Zbior<Zbior<int>> zbzb = Zbior<Zbior<int>> ();
    //zbzb.dodajElement(zb1);
    //zbzb.dodajElement(zb2);

    system("PAUSE");
    return 0;
}

2 个答案:

答案 0 :(得分:3)

您声明了一个复制构造函数

Zbior<T>(Zbior<T> const &other);

但不要在任何地方定义它。由于该类在复制时不包含任何需要特别注意的成员,只需删除该声明 - 隐式生成的复制构造函数和赋值运算符将做正确的事。

(如果您使用除.cpp之外的文件扩展名来包含模板的实现,可能会更好,因为这导致包括我自己在内的几个人认为错误将实现放在源代码中或者只是将实现放在与类模板定义相同的标题中。)

答案 1 :(得分:2)

“未解决的外部错误”表示您已声明并尝试使用某些功能,但您尚未提供该功能的定义。有点像这样:

int foo();

int main()
{
  int n = foo();
  return n;
}

foo已被声明并调用(在main中),但没有实现。

您可以实现此构造函数,或者因为您不需要任何特殊行为,只需删除声明。


再看一下你的错误信息:

  

LNK2019:未解析的外部符号“public:__ thishisall    Zbior :: Zbior(Zbior const&amp;)类“(?? 0?$ Zbior @ H @@ QAE @ ABV0 @@ Z)在函数”public:class Zbior __thiscall中引用   Zbior :: operator +(类Zbior const&amp;)“(?? H?$ Zbior @ H @@ QAE?AV0 @ ABV0 @@ Z)

这告诉你你已宣布:

template<class T>
class Zbior
{
public:
  [...]
    Zbior<T>(Zbior<T> const &other);    

但没有定义它。

事实上,当我查看其他发布的代码时,我发现这是真的。此复制构造函数没有定义。