2013-12-16 4 views
-2

Я не могу перегрузить оператора +, и я понятия не имею, почему. Я пробовал много решений, но мне не удалось решить эту проблему. (Оператор + = отлично работает)Перегрузка оператора «+» в файле .h, ошибка компоновщика

Я не понимаю. Не могли бы вы помочь?

Я получаю сообщение об ошибке:

LNK2019: unresolved external symbol "public: __thiscall Zbior::Zbior(class Zbior const &)" ([email protected]@@[email protected]@@Z) referenced in function "public: class Zbior __thiscall Zbior::operator+(class Zbior const &)" ([email protected]@@[email protected]@@Z)

Проблема не существует, когда я изменить возвращаемый объект метода: оператора Zbior + (сопзИте Zbior & другого)

к

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; 
} 

Ussage класса:

#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; 
} 
+0

Это не дубликат. Я это видел. Мой код не работает и просто не знает, почему. – user3108729

+0

ЕГО дубликат. Я не понимаю, почему вы пишете файлы .cpp с помощью шаблонов, если вы действительно прочитали этот поток ... – Manu343726

+0

@juanchopanza Не совсем обманутый, так как он '# включает' файл cpp, но ошибки могут быть из-за того, что он включает он перед файлом h – Praetorian

ответ

3

Вы объявляете конструктор копирования

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

но не определяют его в любом месте. Поскольку класс не содержит каких-либо членов, которые требуют особого внимания при копировании, просто удалите это объявление - неявно созданный конструктор копий и оператор присваивания будут делать правильные вещи.

(Возможно, было лучше, если вы использовали расширение файла, отличное от .cpp, для заголовка, содержащего реализацию шаблона, поскольку это побуждает нескольких людей, включая меня, думать, что ошибка помещала реализацию в исходный файл. просто поставьте реализацию в том же заголовке, что и определение шаблона класса.)

+1

'.inl' - традиционное имя для .h'-содержащих-реализаций (' inl' значение inline). Или просто назовите его 'foo_impl.h', который я предпочитаю. – Yakk

+0

Спасибо u! Я потратил 4 часа на тестирование множества различных решений, но забыл об определенном его ... (без конструктора копирования он все равно падает, это необходимо) – user3108729

2

«Неразрешенная внешняя ошибка» означает, что вы заявили и попытались использовать какую-либо функцию, но вы не указали определение этой функции. Вроде как это:

int foo(); 

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

foo был объявлен и называется (в main), но нет реализации для него.

Вы можете либо реализовать этот конструктор, либо, поскольку вам не нужно какое-либо особое поведение в нем, просто удалите объявление.


Взгляните еще раз на ваше сообщение об ошибке:

LNK2019: unresolved external symbol "public: __thiscall Zbior::Zbior(class Zbior const &)" ([email protected]@@[email protected]@@Z) referenced in function "public: class Zbior __thiscall Zbior::operator+(class Zbior const &)" ([email protected]@@[email protected]@@Z)

Это говорит вам, что вы заявили:

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

но не определил его.

И на самом деле, когда я просматриваю ваш другой опубликованный код, я считаю, что это правда. Определения для этого конструктора копии нет.

Смежные вопросы