如何在 C++ 中将运算符作为函数调用
Posted
技术标签:
【中文标题】如何在 C++ 中将运算符作为函数调用【英文标题】:How to call an operator as function in C++ 【发布时间】:2011-04-27 15:12:20 【问题描述】:我想调用某个类的特定基类的特定运算符。对于简单的功能很容易:我只写SpecificBaseClass::function( args );
。我应该如何为操作员实现相同的功能而不需要施放诡计?
孤立的问题:
class A
public:
A operator+( const A &other ) const ...
;
class B : public A
public:
B operator+( const B & other ) const ...
;
...
B a, b;
B c = A::operator+( a, b ); //how this should be implemented? I get an error
...
我从 GCC4.5.1 收到以下错误:
error: no matching function for call to ‘A::operator+(B&, B&)’
note: candidate is: A A::operator+(const A&) const
谢谢!
编辑 我已经改进了示例以更好地说明问题。
【问题讨论】:
【参考方案1】:C++中有两个概念:一个是操作符,另一个是操作符函数。非正式的运算符是广义上的内置运算符。您不能以功能表示法调用它们。运算符函数是所谓的重载运算符,正如从许多答案中已经看到的那样:也就是说,如果 @ 是 A 类的成员二元运算符,则 someObjectOfTypeA.operarot@(someOtherObject)
,或者如果它是独立函数,则喜欢operator@ (object1, object2)
【讨论】:
【参考方案2】:将函数指定为的语法
<Class>::<Method>
在Method()
是Class
中的静态方法时使用。如果Method()
是实例方法,则调用是在类对象上。
Class classObject;
classObject.Method()
在这种特殊情况下,operator+()
方法的声明和使用不匹配。
因此,一种方法是使operator+()
方法static
。但是,我认为,operator
方法只能是非静态成员函数或非成员函数。
有了所有这些知识,这里有一个完整的说明性程序。
#include <cassert>
struct B
int num_;
B(int num) : num_( num )
static B add( const B & b1, const B & b2 )
return B( b1.num_ + b2.num_ );
B operator+( const B & rhs )
return B( num_ + rhs.num_ );
;
int main()
B a(2), b(3);
B c = B::add( a, b );
assert( c.num_ == 5 );
B d = a + b;
assert( d.num_ == 5 );
add()
函数仅作为示例,但不要这样做。
【讨论】:
【参考方案3】:操作符是一个非静态成员函数,所以你可以使用
a.A::operator+( b )
但是,对于将operator+
定义为静态成员函数的另一个类,您尝试的将是正确的。第三类可能会使其成为免费功能(可以说是最好的方法),所以B::operator+(a,b)
和a.operator+(b)
都不正确,operator+(a,b)
是正确的。
通常最好只使用运算符语法a+b
,除非您确切知道它是什么类,并且它的实现永远不会改变。在模板上下文中,写a+b
是必须的,而且如果没有大量工作,基本上不可能获取重载的地址(需要命名它的唯一任务)。
在您的上下文中(对另一个答案的评论提到模板),最好的解决方案是
c = static_cast< A const & >( a ) + static_cast< A const & >( b );
...问题是通过对类型进行切片以反映子问题来解决的,而不是精确地命名您想要的函数。
【讨论】:
【参考方案4】:为什么不:
B c = a + b;
【讨论】:
因为他想使用A
的operator+
的实现,但是这将使用B
的operator+
的实现。【参考方案5】:
你不能直接说
c = b + a;
【讨论】:
您假设 + 运算符对于 A 类是对称的。虽然一个好的编码指南会建议这不是语言的要求。【参考方案6】:尝试:
a.operator+(b);
【讨论】:
在特定情况下,我应该写“ static_cast以上是关于如何在 C++ 中将运算符作为函数调用的主要内容,如果未能解决你的问题,请参考以下文章