как вызвать оператор как функцию в C++

Я хочу вызвать определенный оператор определенного базового класса некоторого класса. Для простых функций это просто: я просто пишу 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 ответов


оператор является нестатической функцией-членом, поэтому вы можете использовать

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

... проблема решается путем нарезки типов, чтобы отразить подзадачу, не точно называя функцию, которую вы хотите.


попробовать с:

a.operator+(b);

синтаксис определения функции

<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() функция, например, только, не делайте этого.


в C++ есть два понятия: один-оператор, а другой-оператор-функция. Оператор неофициально-это то, что широко называется встроенным оператором. Вы не можете называть их функциональными обозначениями. Оператор-функция-это то, что называется перегруженным оператором, который вы можете вызвать, как уже видно из многих ответов: то есть, если @ является членом двоичного оператора класса A, то someObjectOfTypeA.operarot@(someOtherObject), или если это автономная функция, то как operator@ (object1, object2)


вы не можете просто сказать

c = b + a;

почему бы и нет:

B c = a + b;