0

i got the error "multiple definition of". I've been searching for bad inclusion but i don't see anything wrong.

My code summarized:

  • a VectorDictionnary class, derived from AbstractDictionnary
  • VectorDictionnary has a .cpp and .hpp
  • AbstractDictionnary only has .hpp
  • a main.cpp that includes "VectorDictionnary.hpp"
  • i compile with :

g++ -std=c++14 -Wall -Wextra main.cpp VectorDictionnary.hpp AbstractDictionnary.hpp VectorDictionnary.cpp

Here's what says the compiler:

g++ -std=c++14 -Wall -Wextra main.cpp AbstractDictionnary.hpp VectorDictionnary.hpp VectorDictionnary.cpp

/tmp/cccKJOw1.o: In function AbstractDictionnary::operator+=(AbstractDictionnary&)': VectorDictionnary.cpp:(.text+0x0): multiple definition ofAbstractDictionnary::operator+=(AbstractDictionnary&)' /tmp/ccdwuuCz.o:main.cpp:(.text+0x0): first defined here collect2: error: ld returned 1 exit status

And here's my code:

main.cpp

#include "VectorDictionnary.hpp"

int main()
{
    return 0;
}

AbstractDictionnary.hpp

#ifndef ABSTRACTDICTIONNARY_HPP
#define ABSTRACTDICTIONNARY_HPP

#include <string>
#include <iostream>

class AbstractDictionnary {
public:

    virtual void insert(const std::string&)=0;
    virtual void erase(const std::string&)=0;
    virtual bool search(const std::string&) const=0;
    virtual void insert_to(AbstractDictionnary&)=0;
    AbstractDictionnary& operator+=(AbstractDictionnary&);


    virtual ~AbstractDictionnary();
};

inline AbstractDictionnary::~AbstractDictionnary() = default;

AbstractDictionnary& AbstractDictionnary::operator +=(AbstractDictionnary& right)
{
    right.insert_to(*this);
    return *this;
}


#endif // ABSTRACTDICTIONNARY_HPP

VectorDictionnary.hpp

#ifndef VECTORDICTIONNARY_HPP
#define VECTORDICTIONNARY_HPP


#include "AbstractDictionnary.hpp"
#include <vector>

class VectorDictionnary final : public AbstractDictionnary
{
public:
    void insert(const std::string&) override;
    void erase(const std::string&) override;
    bool search(const std::string&) const override;
    void insert_to(AbstractDictionnary&) override;

    std::vector<std::string>::iterator begin();
    std::vector<std::string>::iterator end();

    std::size_t size() const;
    void show() const;

    ~VectorDictionnary()=default;

private:
    std::vector<std::string> _vector;
};


#endif //VECTORDICTIONNARY_HPP

VectorDictionnary.cpp

#include "VectorDictionnary.hpp"

void VectorDictionnary::insert(const std::string& s)
{
    auto it = _vector.begin();
    while(it != _vector.end() && *it < s) ++it;
    if(it == _vector.end() || *it != s) _vector.insert(it, s);
}

void VectorDictionnary::erase(const std::string& s)
{
    auto it = _vector.begin();
    while(it != _vector.end() && *it != s) ++it;
    if(it != _vector.end()) _vector.erase(it);
}

bool VectorDictionnary::search(const std::string& s) const
{
    auto it = _vector.begin();
    while(it != _vector.end() && *it < s) ++it;
    if(it == _vector.end() || *it != s) return false;
    return true;
}

std::size_t VectorDictionnary::size() const
{
    return _vector.size();
}


void VectorDictionnary::show() const
{
    for(auto it = _vector.begin(); it != _vector.end(); ++it)
    {
        std::cout << *it << " ";
    }
    endl(std::cout);
}

std::vector<std::string>::iterator VectorDictionnary::begin()
{
    return _vector.begin();
}

std::vector<std::string>::iterator VectorDictionnary::end() 
{
    return _vector.end();
}

void VectorDictionnary::insert_to(AbstractDictionnary& ad)
{
    for(auto it = begin(); it != end(); ++it) ad.insert(*it);
}

Thanks for reading

0 Answers0