C++ C++;操作员问题

C++ C++;操作员问题,c++,operator-keyword,C++,Operator Keyword,我不知道这个问题是否已经在stackoverflow上得到了回答。但我就是找不到合适的关键字来搜索 我在下面插入了一些代码的精简版本 所以基本上我在main()中要做的就是从t2中减去122。我想我的编译器会自动将整数转换为Timestamp对象,然后减去它,如'Timestamp.cpp'所示 但当它到达t4时,它不会转换它,并给出以下错误: “722-t1”中的“运算符-”不匹配 我100%确信这是可能的。但是怎么做呢 也许我完全错了转换。。。所以请不要犹豫纠正我,我正在努力学习一些东西 精

我不知道这个问题是否已经在stackoverflow上得到了回答。但我就是找不到合适的关键字来搜索

我在下面插入了一些代码的精简版本

所以基本上我在main()中要做的就是从t2中减去122。我想我的编译器会自动将整数转换为Timestamp对象,然后减去它,如'Timestamp.cpp'所示

但当它到达t4时,它不会转换它,并给出以下错误:

“722-t1”中的“运算符-”不匹配

我100%确信这是可能的。但是怎么做呢

也许我完全错了转换。。。所以请不要犹豫纠正我,我正在努力学习一些东西

精简代码:

main.cpp:

#包括
#包括
#包括“Timestamp.h”
使用名称空间std;
int main(){
时间戳t3(t2-122);

cout您需要定义以下非成员函数:

Timestamp operator-(int left, const Timestamp &right)
{
    //define
}
Timestamp operator-( Timestamp lhs, Timestamp const & rhs ); // Returns a timestamp?? really??
顺便说一下,将成员
操作符-()
常量函数设置为:

Timestamp operator-(const Timestamp &t) const;
                                       //^^^^^ this makes the function const
如果设置此常量,则只有
right-left
可以工作,因为
right
是常量对象,因此只能对其调用常量成员函数


我注意到您有一个构造函数,它以
int
为参数。这个构造函数的行为类似于从
int
TimeStamp
的隐式转换函数,也就是说,您不需要定义两个
操作符-()
函数(一个是您已经定义的成员函数,另一个是我上面建议的非成员函数)。相反,您只能定义一个这种类型的友元函数:

Timestamp operator-(const Timestamp &left, const Timestamp &right)
{
  //define
}
你必须成为该类的
朋友,因为它需要访问该类的
私人成员。然而,@David提供了一个更好的解决方案。但我保留该解决方案只是为了学术目的。

我看到了两件事:

首先,构造函数接受int类型的参数。运算符返回TimeStamp类型,然后将其传递给构造函数。您尚未指定从TimeStamp到int的转换,因此这不起作用


第二,您的运算符正在获取timestamp类型的参数,但在实际使用时,您似乎从中减去了一个int。虽然它不知道int是什么,因为您没有告诉它!

与其他答案建议的相反,您不需要提供一个专门的
运算符-
来获取
int
时间戳
,而您可以(也可能应该)将
运算符-
设置为非成员函数:

Timestamp operator-(int left, const Timestamp &right)
{
    //define
}
Timestamp operator-( Timestamp lhs, Timestamp const & rhs ); // Returns a timestamp?? really??
这样,编译器就可以自由地将转换应用于左侧和右侧操作数,并使用从
int
时间戳的隐式转换


您可以阅读有关运算符重载设计和实现的简短说明,也可以在SO中的[C++-faq]标记中搜索“运算符重载”。

您的
时间戳::运算符-(int)
允许您从时间戳对象中减去整数。它不允许您从整数中减去时间戳

您需要添加运算符-作为自由函数

Timestamp operator-(int, const Timestamp&);

这需要是Timestamp的朋友,因为它需要访问私有成员。

您不需要提供它,有一个从
int
Timestamp
的隐式转换,因此最好的建议是将
操作符-
完全变成一个免费函数,您可以提供一个可以使用的实现d表示
1-ts
ts-1
@DavidRodríguez-dribeas:Ohh..我没有注意到构造函数隐式地将
int
转换为
TimeStamp
。该操作符实现是错误的。在正规代数中,X-Y!=Y-X(其中X!=Y)我怀疑这个OP在做什么奇异的代数…@JörgenSigvardsson:天啊。我的逻辑怎么了。我只是想我可以用那种方式实现它。如果它是
+
而不是
-
,它会起作用的。谢谢你指出错误的逻辑。:-)为什么不将
lhs
也设为const?+1,尽管我也不认为参数类型中存在非对称性的原因。另外,可能值得注意的是,如果您将其标记为
friend
@Nawaz,则可以在类内定义非成员函数,因为规范实现将是
lhs-=rhs;返回lhs;
@Nawaz:常用的习惯用法是按照
operator-=
将该操作符实现为:
Timestamp操作符-(Timestamp lhs,Timestamp const&rhs){return lhs-=rhs;}
第一个参数是在内部复制和修改的。在第一个参数是右值表达式的情况下,这可能比通过常量引用获取两个参数的性能稍好。特别是在本例中,因为第一个参数是从
int
转换的结果,是右值,而按值排序避免了在内部构建不同的时间戳。@DavidRodríguez dribeas:完全同意。+1。