1

我对容器地图有疑问。我需要将我自己的类 Person 存储在 key 中,但出现错误 C2784(即,“编译器无法从提供的函数参数中确定模板参数。”)。这是“Ivor Horton's beginning 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> &' 来自 '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 *'的模板参数: 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> &' 来自 '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:: 的模板参数unique_ptr<_Ty,_Dx> &' from 'const main::Person' 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: '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 AllClasses

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

4

2 回答 2

1

这里的问题是std::map要求您的密钥与<操作员相当。默认情况下,自定义结构/类不是那样,您需要自定义operator<进行比较。

于 2014-04-23T13:59:03.973 回答
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),或者

  • 从命令解释器运行它。


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

于 2014-04-23T13:51:24.950 回答