2017-10-02 9 views
-2

Class.hエラー:なし一致 '演算子は、<<'

std::ostream& operator<<(std::ostream &strm); 

Class.cpp

std::ostream& operator<<(std::ostream &strm, Classname &a) { 
    return strm << a.getAge(); 
} 

メイン()

を(まだオペレータは<<クラス内で定義されます)
Classname one(5) //this sets the age to 5; 
std::cout << one; 

これは私のコードです。私はこのエラーを探知して、解決策は、常にstd :: ostreamを実装することでした&オペレータ< <私はそれをやったし、それは動作しません。

Classname.h実装内に(Classname)を持つことができない理由もわかりません(Classname.c実装には1つの引数しかないというエラーが表示されます)。それ以外の場合はエラーが発生します。

+2

問題の原因を特定するのに十分なコードがありません。あなたは[mcve]が必要です。起こっていることを推測することはできますが、それはちょうど推測です。 – Justin

+3

最初の2つのコードブロックを見てください。関数のシグネチャは同じですか? – NathanOliver

+0

@Justin MVCEはもっと良いでしょうが、この場合は十分に答えていると思います。ネイサンのコメントを参照してください。 – Borgleader

答えて

1

std::ostream& operator<<(std::ostream &strm);は、class Classnameの体のどこかにあるとします。

これは正しくありません。それはあなたに何をしたいのですか?

one << cout; 

あなたが望むものではありません。両方を作る方が良いでしょうが、(

std::ostream& operator<<(std::ostream &strm, Classname &a); 

:あなたはClassnameの身体の外側が、同じ名前空間に、Class.cppでそれを定義して、それが正しい順序で動作させるためには、それを宣言する必要がありますそのうちのconstの代わりにClassname const& aを使用してください)。

Classname::getAgeprivateまたはprotectedの場合、公開APIはClassnameのみを使用する方がよいでしょう。あなたがそれを行うことができない場合、演算子はfriendである必要があります。それはClassname体に次のようにすべてのこれらのケースでは、次関数へのパラメータは、オペレータ用のクラスの順序と一致していることを

friend std::ostream& operator<<(std::ostream &strm, Classname &a); 

注意を。

関連する問題