2016-10-29 4 views
1

Ich definiere einen abstrakten Datentyp, als ich begann, Operatoren zu definieren, bekomme ich diesen Fehler, verstehe nicht, warum andere ähnliche Projekte meine Operatoren arbeiten und nicht auf diesem.Nicht definierte Referenz auf Funktionsoperator >>

EventoHistorico.h

#ifndef __EVENTO 
#define __EVENTO 

#include <iostream> 
#include <string> 
#include <vector> 

using namespace std; 

/** 
    * @file EventoHistorico.h 
    * @brief T.D.A. EventoHistorico 
    * 
    * The instance of @e c its Abstract data type @c EventoHistorico is an object 
    * that contains a date and a colection of events associated with that date 
    * 
    * Representation: 
    * "date" : <"event1","event2",...> 
    * 
    * Examples: 
    * "1924 : Greed, Sherlock Jr., The Sea Hawk ,The Last Laugh" 
    * "1945 : Merge sort developed by John von Neumann" 
    * 
    * 
    */ 

    string anio; 

    vector<string> eventos; 

    vector<string> GetEvents(); 


    friend istream& operator>> (istream& is, EventoHistorico& EH); 



}; 
#endif 

Auf meinem EventoHistorico.cpp Ich habe die Implementierung dieser Funktion:

istream& operator>> (istream is, EventoHistorico& EH) 
{ 
    // Obtenemos el primer año y la asignamos a la variable 
    // (utilizamos como separador #) 
    getline(is, EH.anio, '#'); 

    // Bandera para salir del bucle cuando se llegue al salto de linea 
    // se utiliza este sistema para no usar break 
    bool salir = false; 

    // Recorre 
    while (!salir && is) 
    { 
     string event; 

     getline(is, event, '#'); 

     EH.eventos.push_back(event); 

     //Si salto de linea 
     if(is.peek() == '\n') 
     { 
      //Obtenemos el siguiente caracter (salto) y salimos del bucle 
      is.get(); 
      salir=true; 
     } 
    } 
    //referencia istream 
    return is; 

} 

Dann, wenn ich diese proyect im kompilieren immer diese Fehlermeldung

src/EventoHistorico.cpp: In function ‘std::istream& operator>>(std::istream, EventoHistorico&)’: 
src/EventoHistorico.cpp:19:10: warning: reference to local variable ‘is’ returned [-Wreturn-local-addr] 
istream& operator>> (istream is, EventoHistorico& EH) 
     ^
g++ -o bin/pruebacronologia obj/cronologia.o obj/pruebacronologia.o obj/EventoHistorico.o 
obj/cronologia.o: On function `operator>>(std::istream&, Cronologia&)': 
/home/antonio/Escritorio/TDA/cronologia/src/cronologia.cpp:32: reference to `operator>>(std::istream&, EventoHistorico&)' undefined 
collect2: error: ld returned 1 exit status 
make: *** [bin/pruebacronologia] Error 1 
+0

Ihr Header sollte eine Klasse oder so definieren? Du hast diesen Teil abgeschnitten. – Deduplicator

+0

Wo ist dein [MCVE]? –

+1

'__EVENTO' ist eine reservierte Kennung. Wenn Sie es in Ihrer Kopfzeile definieren, führt dies zu undefiniertem Verhalten. – user2079303

Antwort

2

Ändern Sie dies ...

istream& operator>> (istream is, EventoHistorico& EH){ 
    return is; // not OK ! ^^--- pass by value 
} 

Sie sollten keine Referenz zurückgeben, wenn is eine lokale Variable ist (Sie erstellen eine Kopie der istream, wenn sie als Parameter übergeben wird). Wenn it eine Referenz ist, dann können Sie auch eine Referenz darauf zurückgeben:

istream& operator>> (istream& is, EventoHistorico& EH) 
    return is; // OK !  ^^--- pass by reference 
}  
+0

Das behebt nicht nur die (verdiente!) Warnung, dass ein Verweis auf eine lokale Variable zurückgegeben wird, sondern auch das undefinierte Funktionsproblem. "EventoHistorico.h" versprach eine Funktion, die einen Stream nach Wert akzeptiert, aber nur eine andere Überladung, die einen Stream als Wert akzeptiert, wurde bereitgestellt. –

+0

Danke, es funktioniert gut – Rusillo

Verwandte Themen