Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

c++ multiple definitions of operator<<

I am attempting to override the << operator for a class. The purpose is basically to implement a toString() like behavior for my class, so that sending it to cout will produce useful output. Using a dummy example, I have the code below. When I attempt to compile, I get the foollowing error:

$ g++ main.cpp Rectangle.cpp /tmp/ccWs2n6V.o: In function `operator<<(std::basic_ostream<char, std::char_traits<char> >&, CRectangle const&)': Rectangle.cpp:(.text+0x0): multiple definition of `operator<<(std::basic_ostream<char, std::char_traits<char> >&, CRectangle const&)' /tmp/ccLU2LLE.o:main.cpp:(.text+0x0): first defined here 

I can't figure out why this is happening. my code is below:

Rectangle.h:

#include <iostream> using namespace std;  class CRectangle {     private:         int x, y;         friend ostream& operator<<(ostream& out, const CRectangle& r);     public:         void set_values (int,int);         int area (); };  ostream& operator<<(ostream& out, const CRectangle& r){     return out << "Rectangle: " << r.x << ", " << r.y; } 

Rectangle.cpp:

#include "Rectangle.h"  using namespace std;  int CRectangle::area (){     return x*y; }  void CRectangle::set_values (int a, int b) {     x = a;     y = b; } 

main.cpp:

#include <iostream> #include "Rectangle.h"  using namespace std;  int main () {     CRectangle rect;     rect.set_values (3,4);     cout << "area: " << rect.area();     return 0; } 
like image 332
ewok Avatar asked Oct 09 '12 14:10

ewok


People also ask

What allows multiple definitions to be created for a single operator?

Multiple definitions for functions and operators can be created by using the concept of overloading. It is a declaration that contains the same name as declared in the various arguments used in the scope of the program.

What is ODR violation?

If an object, a reference or a function is odr-used, its definition must exist somewhere in the program; a violation of that is usually a link-time error. struct S { static const int x = 0; // static data member // a definition outside of class is required if it is odr-used }; const int& f(const int& r); int n = b ? (

What is multiple definition error in C?

If you put a definition of a global variable in a header file, then this definition will go to every . c file that includes this header, and you will get multiple definition error because a varible may be declared multiple times but can be defined only once.


1 Answers

You're breaking the one definition rule. A quick-fix is:

inline ostream& operator<<(ostream& out, const CRectangle& r){     return out << "Rectangle: " << r.x << ", " << r.y; } 

Others are:

  • declaring the operator in the header file and moving the implementation to Rectangle.cpp file.
  • define the operator inside the class definition.

.

class CRectangle {     private:         int x, y;     public:         void set_values (int,int);         int area ();         friend ostream& operator<<(ostream& out, const CRectangle& r){           return out << "Rectangle: " << r.x << ", " << r.y;         } }; 

Bonus:

  • use include guards
  • remove the using namespace std; from the header.
like image 130
Luchian Grigore Avatar answered Sep 23 '22 02:09

Luchian Grigore