как вызвать оператор как функцию в 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 );
... проблема решается путем нарезки типов, чтобы отразить подзадачу, не точно называя функцию, которую вы хотите.
синтаксис определения функции
<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)