2017-10-17 2 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; 
} 

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

오, 그게 나쁘군요. 나는 그것이 빼기와 같이'Power' 대신'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++14, std::minus<void> accepts mismatched arguments and deduces the return type을 사용할 수 있다면 C++14을 사용할 수 있다면 다른 옵션입니다.

+0

감사합니다. 그리고 그것을 std :: cout << (std :: minus () (p1, p2))으로 변경 한 후 age << std :: endl; 연산자를 다시 정의하십시오. Power 연산자 (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