2012-02-13 13 views
6

Aquí está el error:G ++ error del compilador - método sintetizado por primera vez requiere aquí

In file included from /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ios:39, 
       from /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ostream:40, 
       from /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/iostream:40, 
       from date.h:15, 
       from date.cpp:13: 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/ios_base.h: In copy constructor ‘std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)’: 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/ios_base.h:790: error: ‘std::ios_base::ios_base(const std::ios_base&)’ is private 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/iosfwd:47: error: within this context 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/iosfwd: In copy constructor ‘std::basic_ostream<char, std::char_traits<char> >::basic_ostream(const std::basic_ostream<char, std::char_traits<char> >&)’: 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/iosfwd:56: note: synthesized method ‘std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)’ first required here 
date.cpp: In function ‘std::ostream operator<<(std::ostream&, Date&)’: 
date.cpp:389: note: synthesized method ‘std::basic_ostream<char, std::char_traits<char> >::basic_ostream(const std::basic_ostream<char, std::char_traits<char> >&)’ first required here 
make: *** [date.o] Error 1 

creo que puede tener que ver con la forma en mi cabecera y el archivo de origen están recopilando juntos así que aquí está el código para que:

Cabecera:

#ifndef DATE_H 
#define DATE_H 

#include <iostream> 
using namespace std; 

// basic but lengthy class code 

#endif 

Fuente:

// #include <iostream> // tried compiling with and without this, but no change 
#include <cassert> 
#include <cstdlib> 
#include "date.h"  // this is (date.cpp:13) 
// I have tried using namespace std, just to see what would happen but nothing changed 

Por último, aquí es la función que el compilador se refiere a (date.cpp: 389):

ostream operator <<(ostream &out, const Date &date) 
{ 
    // day                  
    out << date.day; 
    switch (date.day) 
    { 
     case 1: 
     case 21: 
     case 31: 
      out << "st"; 
      break; 
     case 2: 
     case 22: 
      out << "nd"; 
      break; 
     case 3: 
     case 23: 
      out << "rd"; 
      break; 
     default: 
      out << "th"; 
      break; 
    } 

    // month                  
    const char MONTHS[12][10] = 
    { "January", "February", "March",  "April", "May",  "June", 
     "July", "August", "September", "October", "November", "December"}; 

    out << " of " << MONTHS[date.month - 1] << ", "; 

    // year                  
    out << date.year; 

    return out; 
} 

estoy completamente desconcertado aquí. He buscado en Google durante la última hora, pero no puedo encontrar nada que resuelva mi problema. Gracias por cualquier ayuda de antemano!

+4

Tenga en cuenta que no debe haber un 'using namespace std;' en un encabezado. –

+0

Consulte esta pregunta para obtener una explicación de por qué ... http://stackoverflow.com/questions/14575799/using-namespace-std-in-a-header-file – Mawg

Respuesta

7

El problema es que no puede devolver un ostream normal. Debe devolver una referencia a la que recibió como argumento (observe &).

ostream & operator <<(ostream &out, const Date &date) 

El compilador se queja de que no puede crear un nuevo objeto ostream copiando out en la línea return out;.

2

El error es más probable aquí:

ostream operator <<(ostream &out, const Date &date) 

La función debe devolver la corriente como referencia, al igual que lo recibe.

Cuestiones relacionadas