2012-02-13 9 views
6

がここにエラーだ:私はそれがどのように私のヘッダーとソースファイルはので、ここで一緒にコンパイルされているとしなければならないかもしれないと思うG ++コンパイラのエラー - 合成方法は、まずここで必要

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 

そのためのコードは次のとおりです。

ヘッダー:

#ifndef DATE_H 
#define DATE_H 

#include <iostream> 
using namespace std; 

// basic but lengthy class code 

#endif 

出典:

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

私は完全にここに困惑しています:

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

は最後に、ここでは、コンパイラは(:389 date.cpp)を参照している機能です。私は最後の1時間の周りにgoogledしかし、私は私の問題を解決するものを見つけることができません。事前に助けてくれてありがとう!

+4

ヘッダーには 'using namespace std;'を使用しないでください。 –

+0

理由の説明についてこの質問を参照してください... http://stackoverflow.com/questions/14575799/using-namespace-std-in-a-header-file – Mawg

答えて

7

問題は、普通のostreamを返すことができないということです。あなたは引数として受け取ったものへの参照を返さなければなりません(&に注意してください)。

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

コンパイラは、それがラインreturn out;outをコピーして、新しいostreamオブジェクトを作成できないことを不平を言います。

2

エラーがここで最も可能性があります:

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

機能は、それはそれを受け取ると同じように、参照としてストリームを返す必要があります。

関連する問題