2014-02-07 3 views
0

Я не знаком с C++, и мой инструктор предоставил функцию, которую я смущен оперегрузка функция оператора ==

 operator long (void); 
     long operator == (Base & base) { 
     return ! strcmp (name, base); 
      } 

Насколько я знаю, оператор делает сравнение на 2 Base объекты? Или я ошибаюсь? Когда я вызываю функцию, она говорит мне, что такого вызова функции нет.

я вызываю функцию она возвращает эту ошибку

нет функции согласования для ... оператора (Base * &, база &)

+0

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

ответ

3

Функция не называется operator, это назвало operator==. Это overloaded comparison operator. Вы просто назвать его так:

Base a, b; 
if(a==b) // <-- this is the function call 
    std::cout<<"equal"<<std::endl; 
else 
    std::cout<<"not equal"<<std::endl; 

Конечно, это тот случай, когда функция является членом из Base класса. Вы не указали весь код, так что я предполагаю, что это так.

Кроме того, первая строка вашего кода является объявлением другого перегруженного оператора (тот, который преобразует класс в long), и его реализация предоставляется где-то в другом месте (возможно).

1

Существует два способа перегрузки оператора.

1.It может быть членом класса или

2.It может быть внеклассной

Пути вызова перегруженной функции оператора зависит и зависит от того, как вы используете. В вашем случае это кажется внутренним классом, но я полагаю, что в декларации есть что-то неправильное и оно не объявлено должным образом. Проверить эту ссылку вопрос может быть полезным Operator overloading outside class

long operator == (Base &base); // this should be your declaration inside your class 

//definition 
long operator == (Base &base){ 
    return !strcmp(name,base.name); 
} 

и вы можете назвать его над классом объекта просто

obj1==obj2 or obj1.operator==(obj2) 

думаю, что это полезно

+0

Просто примечание: если вы сравниваете равенство строк, тогда это должно быть! Strcmp(). – Sayutee

0

Вы можете определить этот оператор в два пути. Сначала вы находитесь в своем базовом классе.

class Base 
{ 
    public: 
    long operator==(Base &base); 
} 

long Base::operator==(Base &base) 
{ 
    ... 
} 

и второй находится за пределами любого класса,

long operator==(Base &left, Base &right) 
{ 
    ... 
} 

Обратите внимание, что один объявленная вне любого класса должны принимать два параметра, и один внутри класса должен принимать только один. Когда вы называете это так,

base1 == base2; 

Если вы используете первый вариант, base1 является объектом, в котором называется оператором, и base2 передается в качестве параметра.

Если вы используете вторую версию, base1 передается как слева, base2 как справа.

Из вашего сообщения об ошибке, я полагаю, вы попытались использовать второй тип, как я писал в этом примере, как если бы он был первого типа.

Смежные вопросы