2012-04-22 15 views
1

私のクラスにはオペレータ< <を使用しようとしています。クラスのフレンドオペレータを使用したコンパイラエラー<<

定義:クラス外

friend std::ostream& operator<<(std::ostream& out, const longint& num); 

定義:ここで はコードだ

std::ostream& operator<<(std::ostream& out, const longint& num_) { 
    if (num_.negative()) 
     out << '-'; 
    longint::const_iterator it = num_.array.end(); 
    --it; 
    longint::const_iterator finish = num_.array.begin(); 
    --finish; 
    while (it != finish) { 
     out << num_.digtochar(*it); 
     --it; 
    } 
} 

longint::negativelongint::arraylongint::digtocharはプライベートで、公開されています。 Google検索の例では、プライベートメンバーはフレンドオペレータで使用できることがわかりますが、エラーが出ます:

../long_arithm.h:57:20: error: «std::list<signed char> long_arithm::longint::array» is private 
../long_arithm.cpp:94:36: error: in this context 
../long_arithm.h:57:20: error: «std::list<signed char> long_arithm::longint::array» is private 
../long_arithm.cpp:96:40: error: in this context 
../long_arithm.h:44:9: error: «long_arithm::schar long_arithm::longint::digtochar(long_arithm::schar) const» is protected 
../long_arithm.cpp:99:28: error: in this context 

なぜですか?私は間違っていますか?

UPD。最小限のコード:

// long_arithm.h 
#ifndef LONG_ARITHM_H_ 
#define LONG_ARITHM_H_ 

#include <iostream> 
#include <list> 

namespace long_arithm { 

    typedef signed char schar; 

    class longint { 
    public: 
     typedef std::list<schar>::const_iterator const_iterator; 

     inline bool negative() const { return minusSign; } 

     friend std::ostream& operator<<(std::ostream& out, const longint& num); 

     enum { error_char = 127 }; 

    protected: 
     schar digtochar(schar num) const; 

    private: 
     bool minusSign; 
     std::list<schar> array; 
    }; 
}; 

// long_arithm.cpp 
#include "long_arithm.h" 
#include <iostream> 

using namespace long_arithm; 

schar longint::digtochar(schar num) const { 
    switch (num) { 
     case 0: return '0'; 
     case 1: return '1'; 
     case 2: return '2'; 
     case 3: return '3'; 
     case 4: return '4'; 
     case 5: return '5'; 
     case 6: return '6'; 
     case 7: return '7'; 
     case 8: return '8'; 
     case 9: return '9'; 
     default: return error_char; 
    } 
} 

std::ostream& operator<<(std::ostream& out, const longint& num_) { 
    if (num_.negative()) 
     out << '-'; 
    longint::const_iterator it = num_.array.end(); 
    --it; 
    longint::const_iterator finish = num_.array.begin(); 
    --finish; 
    while (it != finish) { 
     out << num_.digtochar(*it); 
     --it; 
    } 
    return out; 
} 

の答えをいただき、ありがとうございます。

+1

正常に動作するはずです。問題を再現する最小限のコードを投稿してください。 –

+3

関数から 'out'を返すべきです。 – chris

+0

@LuchianGrigore OK、掲載しました。 –

答えて

5

あなたのfriend宣言は名前空間の中にありますが、関数の定義はありません。したがって、彼らは一致しないし、友人の特権はアクティブ化されていません。

namespace long_arithm 
{ 
    std::ostream& operator<<(std::ostream& out, const longint& num_) 
    { 
     if (num_.negative()) 
      out << '-'; 
     longint::const_iterator it = num_.array.end(); 
     --it; 
     longint::const_iterator finish = num_.array.begin(); 
     --finish; 
     while (it != finish) { 
      out << num_.digtochar(*it); 
      --it; 
     } 
     return out; 
    } 
} 

のように、名前空間内の定義を移動し

、それが作業を開始する必要があります。

関連する問題