Eroare de compilator G++ – Metoda sintetizată este necesară aici prima dată (Programare, C++, Erori De Compilare, G++, Fișiere Header)

Austin Moore a intrebat.

Iată eroarea:

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

Cred că are legătură cu modul în care se compilează împreună fișierul meu de antet și fișierul sursă, așa că iată codul pentru asta:

Header:

#ifndef DATE_H
#define DATE_H

#include <iostream>
using namespace std;

// basic but lengthy class code

#endif

Sursa:

// #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

În cele din urmă, iată funcția la care se referă compilatorul (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;
}

Sunt complet nedumerit aici. Am căutat pe Google în ultima oră, dar nu am găsit nimic care să îmi rezolve problema. Mulțumesc pentru orice ajutor în avans!

Comentarii

  • Vă rugăm să rețineți că nu ar trebui să existe un using namespace std; într-un antet. –  > Por Karl von Moor.
  • Vedeți această întrebare pentru o explicație de ce … stackoverflow.com/questions/14575799/… – –  > Por Mawg spune să o repunem pe Monica.
2 răspunsuri
Didier Trosset

Problema este că nu puteți returna un simplu ostream. Trebuie să returnezi o referință la cel pe care l-ai primit ca argument (rețineți că &).

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

Compilatorul se plânge că nu poate crea un nou element ostream prin copierea obiectului out pe linia return out;.

Un programator oarecare

Eroarea este cel mai probabil aici:

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

Funcția ar trebui să returneze fluxul sub formă de referință, așa cum îl primește.