代码之家  ›  专栏  ›  技术社区  ›  user283145

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

  •  11
  • user283145  · 技术社区  · 14 年前

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

    我从中得到以下错误 一般条款4.5.1

    error: no matching function for call to ‘A::operator+(B&, B&)’
    note: candidate is: A A::operator+(const A&) const
    

    谢谢 !


    编辑
    为了更好地说明这个问题,我改进了这个例子。

    6 回复  |  直到 6 年前
        1
  •  18
  •   Potatoswatter R. Martinho Fernandes    14 年前

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

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

    这个问题是通过对类型进行切片以反映子问题来解决的,而不是精确地命名所需的函数。

        2
  •  4
  •   Dr. Snoopy    14 年前

    a.operator+(b);
    
        3
  •  4
  •   Arun    14 年前

    将函数指定为

    <Class>::<Method>
    

    在以下情况下使用 Method() 是中的静态方法 Class 方法() 是实例方法,则调用在类对象上。

    Class classObject;
    classObject.Method()
    

    在这种情况下,声明和使用 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()

        4
  •  4
  •   Armen Tsirunyan    14 年前

    C++中有两种概念:一种是算子,另一种是算子函数。运算符非正式地被广泛地称为内置运算符。不能用函数表示法调用它们。操作符函数就是所谓的重载操作符,从很多答案中都可以看出:也就是说,如果@是类a的成员二进制操作符,那么 someObjectOfTypeA.operarot@(someOtherObject) ,或者如果它是独立函数,则 operator@ (object1, object2)

        5
  •  1
  •   Faheem    14 年前

    你就不能说

    c = b + a;
    
        6
  •  1
  •   user318904    14 年前

    B c = a + b;