簡體   English   中英

錯誤C2784,密鑰映射中的類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM