2012-06-22 22 views
5

Sto cercando di lavorare su overloading degli operatori, il mio file di intestazione è composta da:undefined reference to operatore >>

#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 

e Classe definizione di

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

chiamando fatto attraverso principale è

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

ma la compilazione mi mostra un errore del compilatore: undefined reference to 'operator>>(std:istream&, Phonenumber&)' Qualcuno potrebbe aiutarmi a risolvere questo errore

+6

sto vedendo un 'istraem' nella definizione di operatore flusso di input. Ma è solo un errore di battitura, non è vero? –

+0

Non è stato definito un operatore con lato sinistro? Non chiamerebbe questo operatore solo se scrivi 'phonenumberObj << ostrObj'? Edit: Nevermind, in qualche modo ho perso la seconda argomentazione ^^ – Paranaix

+6

Alcune persone ti diranno di non usare mai 'using namespace std;'. Non andrei così lontano, penso che sia a posto finchè ne limiti l'ambito. Ma penso che * tutti * saranno d'accordo sul fatto che non si dovrebbe metterlo nello spazio dei nomi globale in un'intestazione. –

risposta

13

L'errore "riferimento non definito a ..." è un errore del linker. Il tuo codice va bene, ma non stai collegando tutti i tuoi file sorgente nel prodotto finale, Phonenumber.cpp (o come lo chiami tu) viene lasciato fuori.

Sul mio sistema,

 
$ 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 

Notate come Phonenumber.cpp non è incluso nella compilation. Se si include esso,

 
$ g++ main.cpp Phonenumber.cpp 
$ ./a.out 
Enter number in the form (123) 456-7890: 
(555) 555-1234 
(555)555-1234 

È sufficiente definire un file .cpp non è sufficiente, è necessario includere durante il collegamento. Questo non si applica ai file di intestazione.

Diagramma:

 
Source code ---compile--> Object files ---link--> Application 

Phonenumber.cpp ----+ 
        |---> Phonenumber.o ---+ 
       +---+      | 
       |       | 
Phonenumber.h --+       +--> a.out 
       |       | 
       +---+      | 
        |---> main.o ----------+ 
main.cpp -----------+ 
+4

stackoverflow dovrebbe davvero avere badge 'ascii art master' da assegnare votando :) – unkulunkulu

+0

ma come potrei collegare il file usando geany .... –

+0

Non so cosa sia Geany. Fai una domanda a parte. –

Problemi correlati