[英]error C2784 ,class in key map
我的容器映射有問題。 我需要將自己的類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 AllClasses
錯誤2錯誤C2784:'bool std :: operator <(const _Elem *,const std :: basic_string <_Elem,_Traits,_Alloc>&)':無法從'const main ::推導出'const _Elem *'的模板參數人的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 AllClasses
錯誤4錯誤C2784:'bool std :: operator <(const std :: _ Tree <_Traits>&,const std :: _ Tree <_Traits>&)':無法推斷'const std :: _ Tree <_Traits>的模板參數&'來自'const main :: Person'e:\\ microsoft visual studio 10.0 \\ vc \\ include \\ xfunctional 125 1 AllClasses
錯誤5錯誤C2784:'bool std :: operator <(const std :: unique_ptr <_Ty,_Dx>&,const std :: unique_ptr <_Ty2,_Dx2>&)':無法推斷'const std ::的模板參數來自'const main :: Person'的unique_ptr <_Ty,_Dx>&'e:\\ Microsoft Visual Studio 10.0 \\ vc \\ include \\ xfunctional 125 1 AllClasses
錯誤6錯誤C2784:'bool std :: operator <(const std :: reverse_iterator <_RanIt>&,const std :: reverse_iterator <_RanIt2>&)':無法推斷'const std :: reverse_iterator <_RanIt>的模板參數&'來自'const main :: Person'e:\\ microsoft visual studio 10.0 \\ vc \\ include \\ xfunctional 125 1 AllClasses
錯誤7錯誤C2784:'bool std :: operator <(const std :: _ Revranit <_RanIt,_Base>&,const std :: _ Revranit <_RanIt2,_Base2>&)':無法推斷'const std ::的模板參數_Revranit <_RanIt,_Base>&'從'const main :: Person'e:\\ microsoft visual studio 10.0 \\ vc \\ include \\ xfunctional 125 1 AllClasses
錯誤8錯誤C2784:'布爾std :: operator <(const std :: pair <_Ty1,_Ty2>&,const std :: pair <_Ty1,_Ty2>&)':無法推斷'const std ::的模板參數對<_Ty1,_Ty2>和'來自'const main :: Person'e:\\ microsoft visual studio 10.0 \\ vc \\ include \\ xfunctional 125 1 AllClasses
錯誤9錯誤C2676:二進制'<':'const main :: Person'未定義此運算符或未轉換為預定義運算符可接受的類型e:\\ microsoft visual studio 10.0 \\ vc \\ include \\ xfunctional 125 1 AllClasses
在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<
。 您還需要定義它。 也就是說,為您的類Person
定義一個operator<
函數。
這里的問題是std::map
要求您的鍵與<
運算符相當。 自定義結構/類不是默認情況下的類,您需要創建一個自定義operator<
進行比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.