【问题标题】:error C2784 ,class in key map错误 C2784,键映射中的类
【发布时间】:2014-06-08 09:35:35
【问题描述】:

我的容器地图有问题。我需要将我自己的类 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 _Elem *)' : 无法推断出 'const std::basic_string<_elem> &' 来自 'const main::Person' e:\microsoft visual studio 10.0\vc\include\xfunctional 125 1 AllClasses

错误 2 错误 C2784: 'bool std::operator &)' : 无法从 'const 推断出'const _Elem *' 的模板参数main::Person' e:\microsoft visual studio 10.0\vc\include\xfunctional 125 1 AllClasses

错误 3 错误 C2784: 'bool std::operator &,const std::basic_string<_elem> &)' : 无法推断模板来自 'const main::Person' e:\microsoft visual studio 10.0\vc\include\xfunctional 125 1 AllClasses 的 'const std::basic_string<_elem> &' 的参数

错误 4 错误 C2784: 'bool std::operator &,const std::_Tree<_traits> &)' : 无法推断出 'const std::_Tree 的模板参数<_traits> &' from 'const main::Person' e:\microsoft visual studio 10.0\vc\include\xfunctional 125 1 AllClasses

错误 5 错误 C2784: 'bool std::operator &,const std::unique_ptr<_ty2> &)' : 无法推断出 'const 的模板参数std::unique_ptr<_ty> &' 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<_ranit2> &)' : 无法推导出 'const std::reverse_iterator 的模板参数<_ranit> &' from 'const main::Person' e:\microsoft visual studio 10.0\vc\include\xfunctional 125 1 AllClasses

错误 7 错误 C2784: 'bool std::operator &,const std::_Revranit<_ranit2> &)' : 无法推断出 'const 的模板参数std::_Revranit<_ranit> &' from 'const main::Person' e:\microsoft visual studio 10.0\vc\include\xfunctional 125 1 AllClasses

错误 8 错误 C2784: 'bool std::operator &,const std::pair<_ty1> &)' : 无法推断出 'const 的模板参数std::pair<_ty1> &' from 'const main::Person' e:\microsoft visual studio 10.0\vc\include\xfunctional 125 1 AllClasses

错误 9 错误 C2676: 二进制 '

【问题讨论】:

  • 对于我们这些不知道“错误 C2784”是什么的人,请将完整且未经编辑的错误日志复制到您的问题中。事实上,当询问有关任何编译器或链接器错误的问题时,请始终这样做。
  • 部分错误是由于这个(模板中使用的本地类型):stackoverflow.com/questions/5751977/… 通过将 Person 的定义移到 main 之外来修复它。

标签: c++ class map keymaps


【解决方案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 的末尾放置一个断点(只需单击左边距)并通过调试运行它(例如,通过按键 F5),或

  • 从命令解释器运行它。


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

【讨论】:

  • 感谢提示使用 Ctrl + F5。关于本地课程,这很有趣。在此之前,我总是使用暂停。 :D
【解决方案2】:

这里的问题是std::map 要求您的密钥与&lt; 运算符相当。自定义结构/类不是默认的,需要自定义operator&lt;进行对比。

【讨论】:

  • 是的,我通过使用重载运算符
猜你喜欢
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
  • 2012-04-22
相关资源
最近更新 更多