У меня проблема с картой контейнера. Мне нужно сохранить свой собственный класс 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
Проблема здесь в том, что std::map
требует, чтобы ваши ключи были сопоставимы с <
оператор. Пользовательские структуры / классы не таковы по умолчанию, вам нужно сделать пользовательские operator<
для сравнения.
В 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
,