проблема с функцией поиска в векторе структуры в C ++ - PullRequest
1 голос
/ 15 июня 2011

Я пытаюсь использовать функцию "найти" здесь. Для этого вот код оператора '=='. Но я получаю ошибку «слишком много параметров для этой операторской функции» при слове «оператор».

Может ли кто-нибудь помочь мне? Спасибо.

struct gr_log
{
   string name;
   string category;
   string description;
   float cost;
   bool operator==(const gr_log& l, const gr_log& r) const

   {
           return l.name == r.name;
  }

};

И

vector<gr_log>::iterator it;
it = find (grocery.begin(), grocery.end(), "Sugar");

Ответы [ 4 ]

4 голосов
/ 15 июня 2011

Оператор-член принимает только один аргумент:

struct gr_log
{
   string name;
   string category;
   string description;
   float cost;
   bool operator==(const gr_log& r)
   {
       return name == r.name;
   }
};

В качестве альтернативы вы можете написать оператор friend:

struct gr_log
{
   string name;
   string category;
   string description;
   float cost;
   friend bool operator==(const gr_log& l, const gr_log& r)
   {
       return l.name == r.name;
   }
};

Также вам необходимо выполнить find используя экземпляр gr_log, потому что вы не можете сравнить gr_log со строкой, как вы пытаетесь это сделать:

it = find (grocery.begin(), grocery.end(), gr_log("Sugar"));
3 голосов
/ 15 июня 2011

Попробуйте это:

struct gr_log
{
   string name;
   string category;
   string description;
   float cost;
   bool operator==(const string& name) {
    return name == this->name;
  }
};

Это создает оператор == (используя правильный синтаксис для переменной-члена; он сравнивает явный аргумент с неявным this), который сравнивает gr_logдо string.Так как ваш std::find вызов использует строку в качестве объекта сравнения, вам будет хорошо.

В качестве альтернативы вы можете определить операторы равенства вне вашего класса:

struct gr_log
{
   string name;
   string category;
   string description;
   float cost;
};
inline bool operator==(const gr_log& gr, const string& name) {
   return name == gr.name;
}
inline bool operator==(const sting& name, const gr_log& gr) {
   return name == gr.name;
}

Примечание 1: ключевые слова inline должны присутствовать, если вы помещаете их в файл заголовка, но не если вы помещаете их в исходный файл.

Примечание 2: Указание обеих функций оператора допускает коммутативныйсвойство равенства.

Наконец, если это не было хэшировано достаточно - оператор равенства члена принимает один параметр, оператор равенства не члена принимает two .

0 голосов
/ 15 июня 2011

У вас есть два варианта: функция bool operator==(a,b) вне структуры или bool operator==(other) внутри структуры.

0 голосов
/ 15 июня 2011

operator == не должен быть членом вашей структуры. Или, если это так, он должен взять 1 аргумент и сравнить его с this:

struct gr_log
{ ...
bool operator==(const gr_log& l) const {return name == r.name;}
}
//or outside of the structure
bool operator==(const gr_log& l, const gr_log& r) 
{
       return l.name == r.name;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...