Po utworzeniu następującej klasy kompilacja kończy się niepowodzeniem z wieloma błędami "duplikatu symbolu". Rzeczywisty błąd nie jest bardzo opisowe:Dlaczego nie oznacza to przeciążenia operatora jako wbudowanego, powodującego duplikowanie błędu definicji?
„duplikat symbol __Zeq .... w: /Users/myusername/Library/Developer/Xcode/DerivedData/MyProject-asdfasfasdf..../Build/Intermediates/ MyProject.build/Debug-iphonesimulator/MyTarget.build/Objects-normal/i386/MyClass.o "pojawia
powyższy samej wiadomości do wielu różnych zajęć, a pojawia się na końcu zestawienia, więc don nie wiem, na czym polega problem.
Sprawdziłem następujące:
- klas, które używają tego dołączyć plik Listening.hpp.
- Jedyna definicja dla tej klasy znajduje się w tym pliku.
Co może być problemem?
#ifndef Listening_hpp
#define Listening_hpp
#include <stdio.h>
#include "EAction.hpp"
class Listening{
private:
int _emitterId;
int _listenerId;
std::string _eventName;
EAction* _actionToTake; //not owned.
protected:
public:
Listening(int emitterId,int listenerId,std::string eventName,EAction* actionToTake) : _emitterId(emitterId),_listenerId(listenerId),_eventName(eventName){
_actionToTake = actionToTake;
}
int getEmitterId()const{
return _emitterId;
}
int getListenerId()const{
return _listenerId;
}
std::string getEventName()const{
return _eventName;
}
EAction* getAction()const{
return _actionToTake;
}
};
bool operator==(const Listening &first,const Listening &other)
{
bool result = false;
if(first.getEmitterId() == other.getEmitterId()){
if(first.getListenerId() == other.getListenerId()){
if(first.getEventName() == other.getEventName()){
if (first.getAction() == other.getAction()) {
result = true;
}
}
}
}
return result;
}
bool operator!=(const Listening &first,const Listening &other)
{
bool result = !(first == other);
return result;
}
#endif /* Listening_hpp */
EAction.hpp
#ifndef EAction_hpp
#define EAction_hpp
#include <stdio.h>
class EAction{
private:
protected:
public:
virtual std::vector<std::size_t> seedList() = 0;
};
#endif /* EAction_hpp */
EDIT: Pod tytułem - Myślę, że to może pomóc ludziom, którzy mają duplikat Błąd definicji z innych powodów zignorować tę odpowiedź.
Ponieważ zdefiniowałeś 'operator ==' i 'operator! =' W pliku nagłówkowym! – Brian
Komentowanie przed greckim kolesiem oznacza to jako dokładny duplikat megathreada –
@Brian Czy możesz wyjaśnić, dlaczego to jest problem? Jestem nowy w C++, ale doświadczony w innych językach programowania, więc nie znam tych podstawowych rzeczy ... –