错误C2784,键映射中的类

时间:2014-04-23 13:41:53

标签: c++ class map keymaps

我的容器地图有问题。我需要在密钥中存储我自己的类Person,但我有错误C2784(即,“编译器无法从提供的函数参数中确定模板参数。”)。这是“Ivor Horton开始使用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&lt;(const std :: basic_string&lt; _Elem,_Traits,_Alloc&gt;&amp;,const _Elem *)':无法推断'const std :: basic_string&lt的模板参数; _Elem,_Traits,_Alloc&GT; &安培;”来自'const main :: Person'e:\ microsoft visual studio 10.0 \ vc \ include \ xfunctional 125 1 AllClasses

错误2错误C2784:'bool std :: operator&lt;(const _Elem *,const std :: basic_string&lt; _Elem,_Traits,_Alloc&gt;&amp;)':无法推断'const _Elem *'的模板参数'const main :: Person'e:\ microsoft visual studio 10.0 \ vc \ include \ xfunctional 125 1 AllClasses

错误3错误C2784:'bool std :: operator&lt;(const std :: basic_string&lt; _Elem,_Traits,_Alloc&gt;&amp;,const std :: basic_string&lt; _Elem,_Traits,_Alloc&gt;&amp;)':can不推断'const std :: basic_string&lt; _Elem,_Traits,_Alloc&gt;的模板参数&安培;”来自'const main :: Person'e:\ microsoft visual studio 10.0 \ vc \ include \ xfunctional 125 1 AllClasses

错误4错误C2784:'bool std :: operator&lt;(const std :: _ Tree&lt; _Traits&gt;&amp;,const std :: _ Tree&lt; _Traits&gt;&amp;)':无法推断'const std的模板参数:: _树&LT; _Traits&GT; &安培;”来自'const main :: Person'e:\ microsoft visual studio 10.0 \ vc \ include \ xfunctional 125 1 AllClasses

错误5错误C2784:'bool std :: operator&lt;(const std :: unique_ptr&lt; _Ty,_Dx&gt;&amp;,const std :: unique_ptr&lt; _Ty2,_Dx2&gt;&amp;)':无法推断出模板参数对于'const std :: unique_ptr&lt; _Ty,_Dx&gt; &安培;”来自'const main :: Person'e:\ microsoft visual studio 10.0 \ vc \ include \ xfunctional 125 1 AllClasses

错误6错误C2784:'bool std :: operator&lt;(const std :: reverse_iterator&lt; _RanIt&gt;&amp;,const std :: reverse_iterator&lt; _RanIt2&gt;&amp;)':无法推断出'const std'的模板参数:: reverse_iterator的&LT; _RanIt&GT; &安培;”来自'const main :: Person'e:\ microsoft visual studio 10.0 \ vc \ include \ xfunctional 125 1 AllClasses

错误7错误C2784:'bool std :: operator&lt;(const std :: _ Revranit&lt; _RanIt,_Base&gt;&amp;,const std :: _ Revranit&lt; _RanIt2,_Base2&gt;&amp;)':无法推断出模板参数对于'const std :: _ Revranit&lt; _RanIt,_Base&gt; &安培;”来自'const main :: Person'e:\ microsoft visual studio 10.0 \ vc \ include \ xfunctional 125 1 AllClasses

错误8错误C2784:'bool std :: operator&lt;(const std :: pair&lt; _Ty1,_Ty2&gt;&amp;,const std :: pair&lt; _Ty1,_Ty2&gt;&amp;)':无法推断出模板参数对于'const std :: pair&lt; _Ty1,_Ty2&gt; &安培;”来自'const main :: Person'e:\ microsoft visual studio 10.0 \ vc \ include \ xfunctional 125 1 AllClasses

错误9错误C2676:二进制'&lt;' :'const main :: Person'没有定义此运算符或转换为预定义运算符可接受的类型e:\ microsoft visual studio 10.0 \ vc \ include \ xfunctional 125 1 AllClasses

2 个答案:

答案 0 :(得分:1)

在C ++ 03中,你不能使用本地类(函数中定义的类)作为模板参数。

在C ++ 11中你可以。

因此,一个修复是更新编译器(有Visual C ++ 2013),另一个修复是将类定义移出main


顺便说一句, void main 作为标准C ++和标准C无效,而且输入的内容比标准int main更多。如果您的图书有void main,那么这本书非常不合适。包含void main的微软示例也非常不合适。


另外,顺便说一下,

system("Pause");

最后也是非常有用的练习,因为

  • 没有必要,没有优势,但

  • 它使程序更难以使用并出现其他一些问题,最重要的是,

  • 它是Windows特有的,不可移植的代码。

运行控制台程序,使其在结束时停止

    Visual Studio中的
  • 使用 Ctrl + F5

  • 在Visual Studio中
  • main的末尾放置一个断点(只需单击左边距)并通过调试运行它(例如通过keypress F5 < / kbd>),或

  • 从命令解释程序运行它。


更新:现在添加的错误消息(即使是第一个)提到operator<。您还需要定义它。也就是说,为您的班级operator<定义Person函数。

答案 1 :(得分:1)

此处的问题是std::map要求您的密钥与<运算符相当。自定义结构/类不是默认情况下,您需要进行自定义operator<进行比较。