如何在C ++中将操作符作为函数调用

时间:2010-10-19 17:43:55

标签: c++ inheritance function operators

我想调用某个类的特定基类的特定运算符。对于简单的函数,它很简单:我只写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

感谢的!


修改
我已经改进了这个例子来更好地说明问题。

6 个答案:

答案 0 :(得分:18)

运算符是非静态成员函数,因此您可以使用

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 );

...问题是通过切片类型来反映子问题来解决的,而不是精确地命名你想要的函数。

答案 1 :(得分:4)

尝试:

a.operator+(b);

答案 2 :(得分:4)

将函数指定为

的语法
<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 :(得分:4)

C ++中有两个概念:一个是运算符,另一个是运算符函数。非正式的操作员是广义上称为内置操作员的人。你不能用功能表示法来称呼它们。运算符函数是所谓的重载运算符,您可以从许多答案中看到它:即,如果@是A类的成员二元运算符,那么someObjectOfTypeA.operarot@(someOtherObject),或者它是一个独立函数,然后像operator@ (object1, object2)

答案 4 :(得分:1)

你能不能说

c = b + a;

答案 5 :(得分:1)

为什么不:

B c = a + b;