2012-06-22 17 views
5

Estoy tratando de trabajar en la sobrecarga de operadores, mi archivo de cabecera consiste en:referencia indefinida a operador >>

#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 

y Clase definición de

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

llamamiento hecho a través principal es

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

pero compilando esto me muestra un error del compilador: undefined reference to 'operator>>(std:istream&, Phonenumber&)' ¿Podría alguien ayudarme a resolver este error

+6

que estoy viendo un 'istraem' en la definición del operador de flujo de entrada. Pero es solo un error tipográfico, ¿no? –

+0

¿No estás definiendo un operador del lado izquierdo? ¿No llamaría solo a este operador si escribe 'phonenumberObj << ostrObj'? Editar: No importa, de alguna manera se han perdido el segundo argumento ^^ – Paranaix

+6

Algunas personas le dirán que nunca use 'using namespace std;'. No llegaría tan lejos, creo que está bien siempre y cuando limites su alcance. Pero creo que * todos * aceptarán que no debes ponerlo en el espacio de nombre global en un encabezado. –

Respuesta

13

El error "referencia indefinida a ..." es un error de enlazador. Su código está bien, pero no está vinculando todos sus archivos de origen en el producto final, Phonenumber.cpp (o como se llame) se está omitiendo.

En mi 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 

Observe cómo Phonenumber.cpp no está incluido en la compilación. Si se incluye,

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

simplemente está definiendo un archivo .cpp no es suficiente, hay que incluir al vincular. Esto no se aplica a los archivos de encabezado.

Diagrama:

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

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

stackoverflow realmente debería tener la insignia 'ascii art master' para ser otorgada por votación :) – unkulunkulu

+0

pero ¿cómo podría vincular el archivo? usando geany .... –

+0

No sé qué es geany. Haga una pregunta por separado. –