VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 169|回复: 2

[已解决]vector数组方面的问题

[复制链接]
53_avatar_middle
最佳答案
0 
donate_vip 发表于 2020-8-6 18:12:30 | 显示全部楼层 |阅读模式
请问一下大佬们,为什么我第26行的代码中将const char*换成从const string就错误了呢?
全部代码如下:
#include <iostream>
#include <vector>
#include <sstream>
#include <string>
using namespace std;

struct Student
{
        string name;
        int StudNumber;
        string OutputString;

        Student(string name, int StudNumber)
        {
                this->name = name;
                this->StudNumber = StudNumber;
        }
        bool operator == (const Student& stud)
        {
                return this->name == stud.name;
        }
        bool operator == (const int StudNumber)
        {
                return this->StudNumber == StudNumber;
        }
        bool operator == (const char* name)
        {
                return this->name == name;
        }
        bool operator > (Student& stud)
        {
                return this->StudNumber > stud.StudNumber;
        }
        operator const char*()
        {
                ostringstream Output;
                Output << this->name << "的学号为" << this->StudNumber << endl;
                OutputString = Output.str();
                return OutputString.c_str();
        }
};

int main()
{
        Student stud1("张三", 1), stud2("李四", 2), stud3("王五", 3), stud4("赵六", 4);
        vector<Student> Stud = { stud1,stud2,stud3,stud4 };
        vector<Student>::iterator itor = find(Stud.begin(), Stud.end(), stud3);
        if (itor != Stud.end())
        {
                cout << *itor << endl;
        }
        else
        {
                cout << "超出索引范围" << endl;
        }
        itor = find(Stud.begin(), Stud.end(), 2);
        if (itor != Stud.end())
        {
                cout << *itor << endl;
        }
        else
        {
                cout << "超出索引范围" << endl;
        }
        itor = find(Stud.begin(), Stud.end(), "张三");
        if (itor != Stud.end())
        {
                cout << *itor << endl;
        }
        else
        {
                cout << "超出索引范围" << endl;
        }
}
最佳答案
70_avatar_small
2020-8-7 10:00:40
1.最简单的解决方法   
  1. itor = find(Stud.begin(), Stud.end(), string("张三"));   //强转成string
复制代码


2.原因
  1. bool operator == (const string name)

  2. operator const char* ()
  3. 冲突
复制代码


当你用  *(Student*) == "xxx" 的时候
由于没有重载 operator == (const char*)   所以编译器只能隐式转换来匹配这个式子
这个时候就有歧义了
有可能是  const char* == const char*
也可能是  Student == string   
在find时 stl 里就调用了类似的式子,所以报错了
  1. //vs2019的stl
  2. template <class _InIt, class _Ty>
  3. _InIt _Find_unchecked1(_InIt _First, const _InIt _Last, const _Ty& _Val, false_type) {
  4.     // find first matching _Val
  5.     for (; _First != _Last; ++_First) {
  6.         if (*_First == _Val) {
  7.             break;
  8.         }
  9.     }

  10.     return _First;
  11. }
复制代码
问题.png




上一篇:刚建立的MFC调试不通过?
下一篇:不知道哪出错了,调试了快1小时看不出问题qwq
70_avatar_middle
最佳答案
21 
在线会员 发表于 2020-8-7 10:00:40 | 显示全部楼层    本楼为最佳答案   
bestAnswer
1.最简单的解决方法   
  1. itor = find(Stud.begin(), Stud.end(), string("张三"));   //强转成string
复制代码


2.原因
  1. bool operator == (const string name)

  2. operator const char* ()
  3. 冲突
复制代码


当你用  *(Student*) == "xxx" 的时候
由于没有重载 operator == (const char*)   所以编译器只能隐式转换来匹配这个式子
这个时候就有歧义了
有可能是  const char* == const char*
也可能是  Student == string   
在find时 stl 里就调用了类似的式子,所以报错了
  1. //vs2019的stl
  2. template <class _InIt, class _Ty>
  3. _InIt _Find_unchecked1(_InIt _First, const _InIt _Last, const _Ty& _Val, false_type) {
  4.     // find first matching _Val
  5.     for (; _First != _Last; ++_First) {
  6.         if (*_First == _Val) {
  7.             break;
  8.         }
  9.     }

  10.     return _First;
  11. }
复制代码
01_avatar_middle
最佳答案
39 
online_admins 发表于 2020-8-6 22:27:59 | 显示全部楼层
先把 参数的 const char* name 转成 string 对象,之后再和 this->name 进行比较呢?
看看是否好用?
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-11-24 23:49

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表