Undefined reference to operator >>
10,933
The error "undefined reference to..." is a linker error. Your code is fine, but you are not linking all of your source files into the final product, Phonenumber.cpp
(or whatever you call it) is being left out.
On my system,
$ ls Phonenumber.cpp Phonenumber.h main.cpp $ g++ main.cpp /tmp/cce0OaNt.o: In function `main': main.cpp:(.text+0x40): undefined reference to `operator>>(std::basic_istream<char, std::char_traits<char> >&, Phonenumber&)' main.cpp:(.text+0x51): undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, Phonenumber const&)' collect2: ld returned 1 exit status
Notice how Phonenumber.cpp
is not included in the compilation. If you include it,
$ g++ main.cpp Phonenumber.cpp $ ./a.out Enter number in the form (123) 456-7890: (555) 555-1234 (555)555-1234
Simply defining a .cpp
file is not enough, you have to include when linking. This does not apply to header files.
Diagram:
Source code ---compile--> Object files ---link--> Application Phonenumber.cpp ----+ |---> Phonenumber.o ---+ +---+ | | | Phonenumber.h --+ +--> a.out | | +---+ | |---> main.o ----------+ main.cpp -----------+
Author by
Avinash Gopal
Updated on June 17, 2022Comments
-
Avinash Gopal almost 2 years
I am trying to work on operator overloading, my header file consists of:
#ifndef PHONENUMBER_H #define PHONENUMBER_H #include<iostream> #include<string> using namespace std; class Phonenumber { friend ostream &operator << ( ostream&, const Phonenumber & ); friend istream &operator >> ( istream&, Phonenumber & ); private: string areaCode; string exchange; string line; }; #endif // PHONENUMBER_H
And class definition of
//overload stream insertion and extraction operators //for class Phonenumber #include <iomanip> #include "Phonenumber.h" using namespace std; //overloades stram insertion operator cannot be a member function // if we would like to invoke it with //cout<<somePhonenumber ostream &operator << ( ostream &output, const Phonenumber &number) { output<<"("<<number.areaCode<<")" <<number.exchange<<"-"<<number.line; return output; }//end function opertaor << istream &operator >> ( istream &input, Phonenumber &number) { input.ignore(); //skip ( input>>setw(3)>>number.areaCode;//input areacode input.ignore(2);//skip ) and space input>>setw(3)>>number.exchange;//input exchange input.ignore();//skip - input>>setw(4)>>number.line;//input line return input; }
calling done through main is
#include <iostream> #include"Phonenumber.h" using namespace std; int main() { Phonenumber phone; cout<<"Enter number in the form (123) 456-7890:"<<endl; //cin>> phone invokes operator >> by implicitly issuing the non-member function call operator>>(cin,phone) cin >> phone; //cout<< phone invokes operator << by implicitly issuing the non-member function call operator>>(cout,phone) cout << phone<<endl; return 0; }
but compiling this shows me a compiler error:
undefined reference to 'operator>>(std:istream&, Phonenumber&)'
Could someone help me to resolve this error