重载后调用 std::minus 无法工作 - 运算符
calling std::minus can't work after overloading - operator
我的以下 C++ 代码片段出现编译错误。
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>&&’
.....
std::minus
has a single template parameter 定义输入和输出的类型;它不处理类型切换 AFAICT。您的 operator-
需要 Power
,并且 return 需要 int
,但是 std::minus<Power>
必须需要 return Power
。投诉是因为 std::minus<Power>
returns Power
,并且 ostream
没有接受 Power
.[=26 的 operator<<
的重载=]
如评论中所述,如果可以使用 C++14
、std::minus<void>
accepts mismatched arguments and deduces the return type,那么如果可以使用 C++14
,那是另一种选择。
虽然 std::minus
只能做 T operator-(const T &lhs, const T &rhs)
,但您的运算符没有相同的限制。在 class:
之外声明运算符
int operator-(const Power &lhs, const Power &rhs) {
return lhs.power - rhs.power;
}
现在你可以std::cout << p1 - p2 << std::endl;
我的以下 C++ 代码片段出现编译错误。
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>&&’
.....
std::minus
has a single template parameter 定义输入和输出的类型;它不处理类型切换 AFAICT。您的 operator-
需要 Power
,并且 return 需要 int
,但是 std::minus<Power>
必须需要 return Power
。投诉是因为 std::minus<Power>
returns Power
,并且 ostream
没有接受 Power
.[=26 的 operator<<
的重载=]
如评论中所述,如果可以使用 C++14
、std::minus<void>
accepts mismatched arguments and deduces the return type,那么如果可以使用 C++14
,那是另一种选择。
虽然 std::minus
只能做 T operator-(const T &lhs, const T &rhs)
,但您的运算符没有相同的限制。在 class:
int operator-(const Power &lhs, const Power &rhs) {
return lhs.power - rhs.power;
}
现在你可以std::cout << p1 - p2 << std::endl;