Ошибка: двоичный файл C2679 '==': не найден оператор, который принимает правый операнд типа 'const std :: string' (или не существует приемлемого преобразования - PullRequest
0 голосов
/ 12 мая 2018

Я написал свой код для системы управления сотрудниками, которая хранит объекты класса Employee в векторе, я не получаю ошибок, пока не попробую и не скомпилирую, я получаю ошибку: C2679 бинарный '==': не найден оператор, которыйпринимает правый операнд типа 'const std :: string' (или нет приемлемого преобразования).Но я не уверен, почему любая помощь будет большой, спасибо!

// Employee Management System
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

class Employee
{
public:
    Employee();
    string GetName();
    string GetStatus();
    float GetSalary();
    int GetAge();
    int GetYearHired();

private:
    string m_Name;
    string m_Status;
    float m_Salary;
    int m_Age;
    int m_YearHired;
};

Employee::Employee()
{
    m_Salary = 0;
    m_Age = 0;
    m_YearHired = 0;
}

string Employee::GetName()
{
    string fName;
    string lName;
    cout << "Please enter the new employee's first name: ";
    cin >> fName;
    cout << "Please enter the new employee's last name: ";
    cin >> lName;
    m_Name = fName + lName;
    return m_Name;
}

string Employee::GetStatus()
{
    string status;
    cout
            << "Please enter the employee's status (full time, part time, or manager): ";
    cin >> status;
    return m_Status;
}

float Employee::GetSalary()
{
    float salary;
    cout << "Please enter the employee's salary: ";
    cin >> salary;
    return m_Salary;
}

int Employee::GetAge()
{
    int age;
    while (true)
    {
        cout << "Please enter the employee's age: ";
        cin >> age;
        if (age > 0)
            break;
        else
            cout << "Error: Please enter a positive value.";
    }
    return m_Age;
}

int Employee::GetYearHired()
{
    int yearHired;
    cout << "Please enter what year the employee was hired: ";
    cin >> yearHired;
    return m_YearHired;
}

class Staff
{
    vector<Employee*> emps;
    vector<Employee*>::const_iterator iter;

public:
    Staff();
    virtual ~Staff();
    void Add();
    void Remove();
    void Clear();
    void Display();
};

Staff::Staff()
{
    emps.reserve(20);
}

Staff::~Staff()
{
    Clear();
}

void Staff::Add()
{
    Employee* emp = new Employee;
    emp->GetName();
    emp->GetStatus();
    emp->GetSalary();
    emp->GetAge();
    emp->GetYearHired();
    emps.push_back(emp);
}

void Staff::Remove()
{
    Employee* emp;
    cout << "Which employee would you like to remove?";
    emp->GetName();

    iter = find(emps.begin(), emps.end(), emp->GetName()); // Trying to find the employee in the datbase.
    if (iter != emps.end()) // If the employee is found in the vector it is removed.
    {
        cout << "\n" << *iter << " was removed\n\n";
        emps.erase(iter); // removes employee from the vector.
    }
    else // If the employee is not found in the vector, it tells the user that the employee was not found.
    {
        cout << "Employee not found, please choose anoter employee.\n\n";
    }
}

void Staff::Clear()
{
    cout << "\nDo you really want to clear all employees? (yes/no)\n"; // Asking the user if they want to clear the database.
    string response;
// Storing the response of the user.
    cin >> response; // Getting the users response (yes/no).
    if (response == "yes") // If response is yes.
    {
        vector<Employee*>::iterator iter = emps.begin(); // Declares an iterator for the emps vector and sets it to the beginning of the vector.
        for (iter = emps.begin(); iter != emps.end(); ++iter) // Iterates through vector.
        {
            delete *iter; // Deletes the iterators in the vector, freeing all memory on the heap.* iter = 0;
            // Sets iterator to zero so it does not become a dangling pointer.
        }
        emps.clear(); // Clear vector of pointers.
    }
    else // If response is no.
    {
        cout << "\nAll employee's remain in the database.\n";
    }
}

void Staff::Display()
{
    Employee* emp;
    if (emps.size() == 0) // Checking to see if the database is empty.
        cout
                << "\nThere are no employee's in the database, add employee's to view them here.\n ";
    else // If the cart contains any items.
    {
        cout << "\nThe database contains: \n";
        for (iter = emps.begin(); iter != emps.end(); ++iter) // Displaying the inventory.
        {
            cout << "-------------------------------------------------";
            cout << "Employee's Name         : " << emp->GetName() << endl;
            cout << "Employee's Status       : " << emp->GetStatus() << endl;
            cout << "Employee's Salary       : " << emp->GetSalary() << endl;
            cout << "Employee's Age          : " << emp->GetAge() << endl;
            cout << "Year employee was hired : " << emp->GetYearHired() << endl;
            cout << "-------------------------------------------------";
        }
    }
}

int main()
{
    int option = 0;
    Staff stf;
// Welcoming the user to the Employee Management System program.
    cout
            << "Welcome to our Employee Management System! To get started see the menu options below :\n ";

// Main loop
    while (option != 5) // The loop will repeat until the user enters 5 as the option.
    {
        cout << "------------------------------------------------------------------------------------- - ";
        cout << "\nMenu Options: \n";
        cout << "\nTo select an option, please type in the number that corresponds to that option.\n ";
        cout << "1 - Add an Employee\n2 - Remove an Employee\n3 - Clear the database\n4 - Display Employee's in Database\n5 - Quit" << endl;
        cout << "\nWhat would you like to do? ";
        cout << "------------------------------------------------------------------------------------- - ";

// Start of the validity check.
        bool validInput = false;

        while (!validInput) // The loop will repeat until the users input is valid.
        {
            cin >> option; // User inputs first option choice.
            validInput = true; // Assign the input as valid.
            if (cin.fail()) // Tests to make sure the value assigned is valid for the variable type.
            {
                cout << "\nPlease choose a menu option by number\n";
                cin.clear(); // Clears stream error.
                cin.ignore(numeric_limits<streamsize>::max(), '\n'); // Removes an invalid characters.
                validInput = false; // Sets the input back to false, repeats the loop.
            }
        }

        switch (option)
        {
            case 1:
            {
                stf.Add();
                break;
            }
            case 2:
            {
                stf.Remove();
                break;
            }
            case 3:
            {
                stf.Clear();
                break;
            }
            case 4:
            {
                stf.Display();
                break;
            }
            case 5: // If option = 5.
                cout << "\nThank you for using the Employee Management Program!\n";
                // Thanks the user for using the Employee Management program.
                break;
            default: // If the user does not put in a valid option, it tells them to try again.
                cout << "\nThat's not a valid option. Please try again.\n";
                break;
        }
    }
    system("pause");
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Проблема

std::find будет сравнивать Employee * s в emps с std::string, который возвращается GetName.Для Employee * не определен оператор сравнения, который это делает.Мы можем сделать это, но поскольку поведение GetName заключается в том, чтобы получить и присвоить имя пользователю, а не просто вернуть имя Employee, это быстро превратится в беспорядок.

Решение

Первая остановка сохранения указателей на Employee с в vector с.Это простое изменение устранит большую часть вашей прошлой, настоящей и будущей боли.В общем, используйте new как можно меньше ( Почему программисты на C ++ должны минимизировать использование 'new'? ), а когда вам действительно нужно new, предпочитаете умный указатель .

vector<Employee*> emps;

становится

vector<Employee> emps;

, который имеет волновой эффект через ваш код, не в последнюю очередь

void Staff::Add()
{
    Employee* emp = new Employee;
    emp->GetName();
    emp->GetStatus();
    emp->GetSalary();
    emp->GetAge();
    emp->GetYearHired();
    emps.push_back(emp);
}

должен стать

void Staff::Add()
{
    Employee emp;
    emp.GetName();
    emp.GetStatus();
    emp.GetSalary();
    emp.GetAge();
    emp.GetYearHired();
    emps.push_back(emp);
}

Но также посмотрите на emplace_back и настоятельно рекомендуем получить пользовательский ввод и затем построить emp вокруг него.

bool operator==(const Employee & rhs) const
{
    return m_Name == rhs.m_Name;
}

или friend функцию

bool operator==(const Employee & lhs,
                const Employee & rhs)
{
    return lhs.m_Name == rhs.m_Name;
}

и затем измените вызов на find для сравнения Employee с

iter = find(emps.begin(), emps.end(), emp); // Trying to find the employee in the datbase.

Это может привести к дополнительным проблемам, поскольку iter является const_iterator и переменной-членом (Rubber Ducky хочет поговорить с вами об этом ).Также полностью игнорируется тот факт, что в коде есть еще несколько десятков логических ошибок.

0 голосов
/ 12 мая 2018

Мне кажется (РЕДАКТИРОВАТЬ: закомментировал) string response; объявление до

cin >> response; // Getting the users response (yes/no).

Надеюсь, это направит вас в правильном направлении

EDIT: Это там, но это закомментировано. Попробуйте:

cout << "\nDo you really want to clear all employees? (yes/no)\n"; 
// Asking the user if they want to clear the database.
string response;
// Storing the response of the user.
cin >> response; // Getting the users response (yes/no).
if (response == "yes") // If response is yes.

И я бы дважды проверил весь код, чтобы комментарии не мешали коду

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...