我想调用某个类的特定基类的特定运算符。对于简单的函数,它很简单:我只写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
感谢的!
修改
我已经改进了这个例子来更好地说明问题。
答案 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;