当前位置: 首页 > news >正文

c++ bug 函数定义和声明不一致导致出bug

源码(含有bug):

​
//打印multimap容器的数据
void printMultimap(map<int, int>& m);​
void test17() {multimap<int, int> m;m.insert(make_pair(1, 11));m.insert(make_pair(2, 22));//printMap(m);  bug代码printMultimap(m);}
//打印multimap容器的数据
void printMultimap(multimap<int, int>& m) {for (auto i : m) {cout << "key:" << i.first << "\tvalue:" << i.second << endl;}
}

bug原因分析:

1. 报错信息核心意思

编译器提示:

plaintext

无法将参数 1 从 "std::multimap<...>" 转换为 "std::map<...> &"

也就是说,你调用的 printMultimap 函数的参数类型是:

cpp

运行

std::map<int,int>&

但是你传进去的变量 m 是:

cpp

运行

std::multimap<int,int>

这两个是完全不同的类型,所以编译器拒绝转换。


2. 为什么会这样?

你虽然在代码里写了:

cpp

运行

void printMultimap(multimap<int, int>& m) { ... }

但是从编译器的错误提示来看,它实际找到的 printMultimap 函数声明并不是这样,而是:

cpp

运行

void printMultimap(std::map<int,int> &);

这种情况通常有几个可能原因:

  1. 函数声明和定义不一致你在 .h 头文件里声明的 printMultimap 可能写成了 map,而 .cpp 里的定义写成了 multimap。编译器在编译 test17() 时,看到的是头文件里的声明,所以报了错。

  2. 函数名重复你可能之前写过一个 printMultimap 函数,参数是 map<int,int>&,编译器在查找匹配函数时找到了那个版本,而不是你现在的 multimap 版本。

  3. 代码缓存问题Visual Studio 的 IntelliSense 或编译缓存可能没有更新,导致编译器用的还是旧的函数签名。


3. 验证方法

你可以在 test17() 里加上一行调试代码,验证变量类型:

cpp

运行

cout << typeid(m).name() << endl;

它会输出 class std::multimap<int,int,...>,说明 m 确实是 multimap 类型。

然后再看看函数定义前有没有其他同名函数声明。


4. 解决方法

方法 1:确保声明和定义一致

如果有头文件,比如:

cpp

运行

// myprint.h
#include <map>
using namespace std;
void printMultimap(multimap<int,int>& m);  // 这里必须是 multimap

源文件:

cpp

运行

// myprint.cpp
#include "myprint.h"
void printMultimap(multimap<int,int>& m) {for (auto &i : m) {cout << "key:" << i.first << "\tvalue:" << i.second << endl;}
}

方法 2:清理并重建项目

在 Visual Studio 里:

  • 菜单 生成 → 清理解决方案
  • 再 生成解决方案

这样可以避免旧的编译缓存导致的错误。

方法 3:搜索整个项目

用 Visual Studio 的 “在文件中查找” 功能,搜索 printMultimap,看看是不是有多个声明,类型不一致。


5. 建议写法

为了避免这种类型不匹配的问题,建议用模板函数,这样 map 和 multimap 都能用:

cpp

运行

template <typename Map>
void printMap(const Map& m) {for (const auto& pair : m) {cout << "key:" << pair.first << "\tvalue:" << pair.second << endl;}
}

调用时:

cpp

运行

printMap(m); // m 可以是 map 或 multimap

✅ 结论

 bug 根本原因是函数声明和定义的参数类型不一致,或者编译器用了旧的函数声明。std::map 和 std::multimap 是两种完全不同的容器类型,不能直接互相转换,所以必须保证函数参数类型与传入变量类型一致。

http://www.dtcms.com/a/461502.html

相关文章:

  • 网站建设需求分析文档手机上制作ppt的软件
  • 推广网站怎么做能增加咨询南宁企业官网seo
  • MATLAB的无线传感器网络(WSN)算法仿真
  • k8s opa集成
  • Nginx 负载均衡通用方案
  • 我的世界怎么做神器官方网站dw网站设计与制作
  • ubuntu22.04发布QT程序步骤
  • Spring Boot:分布式事务高阶玩法
  • 做网站开什么端口网址格式
  • 白云区建设局网站建筑工程网教
  • react native android设置邮箱,进行邮件发送
  • Java面试场景:从Spring Boot到Kubernetes的技术问答
  • 从潜在空间到实际应用:Embedding模型架构与训练范式的综合解析
  • Vue3 provide/inject 详细组件关系说明
  • php的网站架构建设框架嘉兴网站设计
  • Redis(四)——Redis主从同步与对象模型
  • 2016年网站建设总结培训学校
  • 网站最下端怎么做动画设计培训机构
  • 用python制作相册浏览小工具
  • 字节跳动ByteDance前端考前总结
  • codex使用chrome-devtools-mcp最佳实践
  • 【Linux命令从入门到精通系列指南】export 命令详解:环境变量管理的核心利器
  • python 自动化采集 ChromeDriver 安装
  • 苏州招聘网站建设推广费
  • java8提取list中对象有相同属性值的对象或属性值
  • cuda编程笔记(26)-- 核函数使用任务队列
  • 存储芯片核心产业链研发实力:兆易创新、北京君正、澜起科技、江波龙、长电科技、佰维存储,6家龙头公司研发实力深度数据
  • 《Seq2Time: Sequential Knowledge Transfer for Video LLMTemporal Grounding》
  • 山东省建设部网站官网网站备案审核通过后
  • 浏览器兼容性问题处理