ошибка C2784, класс в карте ключей

У меня проблема с картой контейнера. Мне нужно сохранить свой собственный класс Person в ключе, но у меня ошибка C2784 (т.е. «Компилятор не может определить аргумент шаблона из предоставленных аргументов функции.»). Это пример из книги «Начало Ивор Хортон Visual C ++ 2010»

#include<map>
#include<string>
#include <iostream>
using namespace std;

void main()
{
class Person{
public:
string c_name,c_surname;
Person(string name,string surname){
c_name=name;
c_surname=surname;
}
};

map<Person,string> phonebook;

phonebook.insert(make_pair(Person("Mel","GIBSON"),"24 32 23"));
phonebook[Person("Mel2","Gibson2")]="243 32 23";

/* it doesn`t work too
typedef pair<Person,string> Entry;
Entry entry1= Entry(Person("Jack","Jones"),"213 567 1234");

phonebook.insert(entry1);*/

system("Pause");
}

Ошибка 1 ошибка C2784: ‘bool std :: operator <(const std :: basic_string<_Elem, _Traits, _Alloc> &, const _Elem *) ‘: не удалось вывести аргумент шаблона для’ const std :: basic_string<_Elem, _Traits, _Alloc> &’from’ const main :: Person ‘e: \ microsoft visual studio 10.0 \ vc \ include \ xfunctional 125 1 Все классы

Ошибка 2 ошибка C2784: ‘bool std :: operator <(const _Elem *, const std :: basic_string<_Elem, _Traits, _Alloc> &) ‘: не удалось вывести аргумент шаблона для’ const _Elem * ‘из’ const main :: Person ‘e: \ microsoft visual studio 10.0 \ vc \ include \ xfunctional 125 1 AllClasses

Ошибка 3 ошибка C2784: ‘bool std :: operator <(const std :: basic_string<_Elem, _Traits, _Alloc> &, const std :: basic_string<_Elem, _Traits, _Alloc> &) ‘: не удалось вывести аргумент шаблона для’ const std :: basic_string<_Elem, _Traits, _Alloc> &’from’ const main :: Person ‘e: \ microsoft visual studio 10.0 \ vc \ include \ xfunctional 125 1 Все классы

Ошибка 4 ошибка C2784: ‘bool std :: operator <(const std :: _ Tree<_Traits> &, const std :: _ Tree<_Traits> &) ‘: не удалось вывести аргумент шаблона для’ const std :: _ Tree<_Traits> &’from’ const main :: Person ‘e: \ microsoft visual studio 10.0 \ vc \ include \ xfunctional 125 1 Все классы

Ошибка 5 ошибка C2784: ‘bool std :: operator <(const std :: unique_ptr<_Ty, _Dx> &, const std :: unique_ptr<_Ty2, _Dx2> &) ‘: не удалось вывести аргумент шаблона для’ const std :: unique_ptr<_Ty, _Dx> &’from’ const main :: Person ‘e: \ microsoft visual studio 10.0 \ vc \ include \ xfunctional 125 1 Все классы

Ошибка 6 ошибка C2784: ‘bool std :: operator <(const std :: reverse_iterator<_RanIt> &, const std :: reverse_iterator<_RanIt2> &) ‘: не удалось вывести аргумент шаблона для’ const std :: reverse_iterator<_RanIt> &’from’ const main :: Person ‘e: \ microsoft visual studio 10.0 \ vc \ include \ xfunctional 125 1 Все классы

Ошибка 7 ошибка C2784: ‘bool std :: operator <(const std :: _ Revranit<_RanIt, _Образы базовой> &, const std :: _ Revranit<_RanIt2, _Base2> &) ‘: не удалось вывести аргумент шаблона для’ const std :: _ Revranit<_RanIt, _Образы базовой> &’from’ const main :: Person ‘e: \ microsoft visual studio 10.0 \ vc \ include \ xfunctional 125 1 Все классы

Ошибка 8 ошибка C2784: ‘bool std :: operator <(const std :: pair<_Ty1, _Ty2> &, const std :: pair<_Ty1, _Ty2> &) ‘: не удалось вывести аргумент шаблона для’ const std :: pair<_Ty1, _Ty2> &’from’ const main :: Person ‘e: \ microsoft visual studio 10.0 \ vc \ include \ xfunctional 125 1 Все классы

Ошибка 9 Ошибка C2676: двоичная ‘<‘:’ const main :: Person ‘не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора e: \ microsoft visual studio 10.0 \ vc \ include \ xfunctional 125 1 AllClasses

1

Решение

Проблема здесь в том, что std::map требует, чтобы ваши ключи были сопоставимы с < оператор. Пользовательские структуры / классы не таковы по умолчанию, вам нужно сделать пользовательские operator< для сравнения.

1

Другие решения

В C ++ 03 вы не могли использовать локальные классы (классы, определенные в функциях) в качестве аргументов шаблона.

В C ++ 11 вы можете.

Таким образом, одно исправление заключается в обновлении компилятора (есть Visual C ++ 2013), а другое исправление заключается в удалении определения класса из main,


Кстати, void main недопустимо как стандарт C ++, так и стандарт C, и это больше для ввода, чем стандарт int main, Если ваша книга имеет void mainтогда это очень плохая книга. Примеры Microsoft, которые включают void main тоже очень плохо.


Кроме того, кстати,

system("Pause");

в конце тоже очень плохая практика, потому что

  • это не нужно, не имеет никакого преимущества, но

  • это делает программу более трудной в использовании и имеет некоторые другие проблемы, и в довершение всего,

  • это специфичный для Windows непереносимый код.

Запустить консольную программу, чтобы она остановилась в конце

  • в Visual Studio использовать Ctrl+F5, или же

  • в Visual Studio разместите точка остановки в конце main (просто щелкните в левом поле) и запустите его с отладкой (например, нажатием клавиши F5), или же

  • запустить его из интерпретатора команд.


ОБНОВИТЬ: теперь добавлены сообщения об ошибках (даже первые) operator<, Вы должны определить это также. То есть определить operator< функция для вашего класса Person,

1

По вопросам рекламы [email protected]