2017-10-17 7 views
0

私のC++コードの次のスニペットでコンパイルエラーが発生しています。オーバーロード後にstd :: minusを呼び出すことができません - 演算子

struct Power{ 
    int power; 
    int age; 
    int operator-(const Power& p1) 
    { 
    return this->power - p1.power; 
    } 
}; 


int main() { 
    Power p1; 
    p1.power = 1; 
    p1.age = 25; 
    Power p2; 
    p2.power = 2; 
    p2.age = 26; 
    std::cout<<std::minus<Power>()(p1, p2)<<std::endl; 
} 

build with C++ 11。建てられない。 エラーメッセージは、次のとおり

error: no match for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘Power’) 
    std::cout<<std::minus<Power>()(p1, p2)<<std::endl; 
     ^
In file included from /usr/include/c++/5/iostream:39:0, 
       from rvaluereference.cpp:1: 
/usr/include/c++/5/ostream:628:5: note: candidate: std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = Power] <near match> 
    operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x) 
    ^
/usr/include/c++/5/ostream:628:5: note: conversion of argument 1 would be ill-formed: 
rvaluereference.cpp:60:39: error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’ 
..... 
+0

を行うことができます。 'p1 - p2'を直接出力することもできません。これは 'std :: minus'とは関係ありません。 – chris

+0

私はp1 - p2がC++で動作することを確信しています11 –

+0

ああ、それは私の悪です。私は、それが減算のように '力'の代わりに 'int'を返すのが普通であるのを見ませんでした。 – chris

答えて

3

std::minus has a single template parameter入力と出力の両方のタイプを定義します。それはタイプスイッチングAFAICTを処理しません。 operator-Powerとなり、intが返されますが、std::minus<Power>は、Powerを返す必要があります。 std::minus<Power>Powerを返し、ostreamoperator<<の過負荷がなく、Powerを受け入れるため、苦情があります。

コメントに記載されているように、C++14std::minus<void> accepts mismatched arguments and deduces the return typeを使用できる場合は、C++14を使用できる場合は別のオプションです。

+0

ありがとうございます。そして、私はそれをstd :: cout <<(std :: minus ()(p1、p2))に変更した後、age << std :: endl;オペレータのような演算子を再定義する - Power operator - (const Power&p1) \t { \t \t return p1; \t}まだ動作しません... –

+0

@WubinOuyang: "うまくいきません"というのは特に役に立ちません。 *変更後にどうやって失敗しますか? – ShadowRanger

+0

/usr/include/c++/5/bits/stl_function.h:182:20:エラー: 'operator-'に一致しません(オペランドの種類は 'const Power'と 'const Power') {return __x - __y; } –

-1

std::minusT operator-(const T &lhs, const T &rhs)しか実行できませんが、オペレータには同じ制限がありません。クラスの外のオペレータ宣言:

int operator-(const Power &lhs, const Power &rhs) { 
    return lhs.power - rhs.power; 
} 

を、今、あなたはあなたはそれが演算子をオーバーロードする前に作業するために使用のように聞こえる作るstd::cout << p1 - p2 << std::endl;

+0

OPは明示的に 'std :: minus'を使用します。 「std :: minus'を使用しないでください」と言っているのは、その傍らのようなものです。それ以外では、非メンバ関数は 'operator-'の方が正しいのですが(非変異型なので)、 'std :: minus'は必要なパターンに従っていればメンバ関数でうまくいくはずです(関数は' const'、引数は、それが定義されたクラスと同じ型の 'const'参照であり、結果は同じ型の' const'値ではありません)。 – ShadowRanger

+0

@ShadowRangerはい、ここでは 'operator-'は 'Power'を返さないのですか?したがって、 'std :: minus'はこの使用には有効ではありません。 – N00byEdge

関連する問題