2017-10-17 50 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'而不是'Power',就像减法一样。 – chris

回答

3

std::minus has a single template parameter限定的两个输入和输出的类型;它不处理类型切换AFAICT。您的operator-需要Power,并且返回int,但std::minus<Power>必须带并返回Power。投诉是因为std::minus<Power>返回Power,并且ostream没有接受Poweroperator<<超载。

如评论中所述,如果您可以使用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::minus只能做T 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'引用,并且结果是相同类型的非''contst'值)。 – ShadowRanger

+0

@ShadowRanger是的,但是这里'operator-'没有返回'Power',是吗?因此'std :: minus'对于此用法无效。 – N00byEdge