我的容器地图有问题。我需要在密钥中存储我自己的类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
答案 0 :(得分:1)
在C ++ 03中,你不能使用本地类(函数中定义的类)作为模板参数。
在C ++ 11中你可以。
因此,一个修复是更新编译器(有Visual C ++ 2013),另一个修复是将类定义移出main
。
顺便说一句, void main
作为标准C ++和标准C无效,而且输入的内容比标准int main
更多。如果您的图书有void main
,那么这本书非常不合适。包含void main
的微软示例也非常不合适。
另外,顺便说一下,
system("Pause");
最后也是非常有用的练习,因为
没有必要,没有优势,但
它使程序更难以使用并出现其他一些问题,最重要的是,
它是Windows特有的,不可移植的代码。
运行控制台程序,使其在结束时停止
使用 Ctrl + F5 或
在main
的末尾放置一个断点(只需单击左边距)并通过调试运行它(例如通过keypress F5 < / kbd>),或
从命令解释程序运行它。
更新:现在添加的错误消息(即使是第一个)提到operator<
。您还需要定义它。也就是说,为您的班级operator<
定义Person
函数。
答案 1 :(得分:1)
此处的问题是std::map
要求您的密钥与<
运算符相当。自定义结构/类不是默认情况下,您需要进行自定义operator<
进行比较。