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

前置声明和头文件之间的关系 问题

出现这些问题的原因是 ORB_SLAM3::MultiGraph 被前置声明了,但在使用的时候,编译器并没有看到 MultiGraph 类的完整定义。前置声明只能用于指针和引用,但如果要访问其成员函数或变量,必须包含完整的类定义。

解决方案步骤:

  1. 头文件依赖问题:由于你有多线程并且不同头文件相互包含,直接包含头文件可能会造成编译错误。最常见的解决办法是减少头文件的相互依赖,同时确保所有需要使用的类都已经定义好。

  2. 将需要访问 MultiGraph 类成员的代码移动到包含 MultiGraph 类定义的地方

    • 在头文件中前置声明 MultiGraph,以便在头文件中使用指针或引用。
    • 在实现文件 (.cpp) 中 #include "MultiGraph.h",以便在实现文件中使用类的成员。

具体修改方法

1. 确保在 map.h 中只使用前置声明

map.h 中,你只需要前置声明 MultiGraph,因为这里只是保存 MultiGraph* 的指针,不需要访问它的成员。

// map.h
#ifndef MAP_H
#define MAP_Hnamespace ORB_SLAM3 {class MultiGraph;  // 前置声明 MultiGraphclass Map {public:MultiGraph* mGlobalMapGraph;  // 指向 MultiGraph 的指针bool isGlobalInitialized = false;void AddGlobalMapGraph();void addEdges(MultiGraph *graph, bool isGlobalMap = false);// 其他成员函数和变量};}  // namespace ORB_SLAM3#endif  // MAP_H
2. 在 map.cc 中包含 MultiGraph.h

由于你在 .cpp 文件中使用了 MultiGraph 的成员(例如 addNodeaddEdge),你需要包含 MultiGraph.h,以便访问 MultiGraph 的完整定义。

// map.cc
#include "Map.h"
#include "MultiGraph.h"  // 需要包含 MultiGraph 的完整定义namespace ORB_SLAM3 {void Map::AddGlobalMapGraph() {if (mvObjectMap.size() > 0) {for (int i = 0; i < mvObjectMap.size(); i++) {GraphNode node_3D;node_3D.obj3D = mvObjectMap[i];mGlobalMapGraph->addNode(node_3D);  // 使用 addNode 成员函数}this->addEdges(mGlobalMapGraph, true);isGlobalInitialized = true;}
}void Map::addEdges(MultiGraph *graph, bool isGlobalMap) {for (size_t i = 0; i < graph->nodes.size(); ++i) {for (size_t j = i + 1; j < graph->nodes.size(); ++j) {float classSim = calculateClassSimilarity(graph->nodes[i].obj3D->mnClass, graph->nodes[j].obj3D->mnClass);if (classSim > 0) {graph->addEdge(i, j, ORB_SLAM3::EdgeType::CATEGORY_EDGE, classSim);}// 继续其他边的计算和添加...}}
}}  // namespace ORB_SLAM3
3. 确保 MultiGraph.h 定义完整的 MultiGraph

MultiGraph.h 文件中,确保你已经完整定义了 MultiGraph 类,包括它的成员函数和结构体。

// MultiGraph.h
#ifndef MULTIGRAPH_H
#define MULTIGRAPH_H#include <vector>
#include <map>
#include "Object.h"  // 假设你需要访问 Object_2D 和 Object_Map 类namespace ORB_SLAM3 {class Object_2D;
class Object_Map;enum EdgeType {CATEGORY_EDGE,COLOR_EDGE,MASK_SIMILARITY_EDGE,BBOX_OVERLAP_EDGE,HISTORY_ASSOCIATION_EDGE
};struct GraphNode {int id;Object_2D* obj2D;Object_Map* obj3D;std::map<int, std::map<EdgeType, float>> edges;
};class MultiGraph {
public:std::vector<GraphNode> nodes;void addNode(const GraphNode& node) {nodes.push_back(node);}void addEdge(int node1, int node2, EdgeType edgeType, float weight) {nodes[node1].edges[node2][edgeType] = weight;nodes[node2].edges[node1][edgeType] = weight;}
};}  // namespace ORB_SLAM3#endif  // MULTIGRAPH_H

总结

  1. 前置声明:在头文件中,尽可能只做前置声明,减少依赖。
  2. 包含完整定义:在 .cpp 文件中包含完整的定义 (#include "MultiGraph.h"),确保可以访问类的成员。
  3. 分离依赖:通过前置声明和头文件包含分离类的依赖,避免相互依赖引起的问题。

这样可以确保你在头文件中可以声明指针类型,并在 .cpp 文件中正常使用类的完整定义,不会再遇到“incomplete type”的错误。

相关文章:

前置声明和头文件之间的关系 问题

出现这些问题的原因是 ORB_SLAM3::MultiGraph 被前置声明了&#xff0c;但在使用的时候&#xff0c;编译器并没有看到 MultiGraph 类的完整定义。前置声明只能用于指针和引用&#xff0c;但如果要访问其成员函数或变量&#xff0c;必须包含完整的类定义。 解决方案步骤&#x…...

Linux02

1.相对路径和绝对路径 cd用于切换目录&#xff0c;对于路径可以用相对路径和绝对路径 例如&#xff1a;cd /home/user/public和cd public效果一样&#xff0c;都是将目录切换到HOME文件夹下的public文件夹 2.特殊路径符 .表示当前目录 ..表示上级目录 ~表示HOME目录 3.m…...

df 命令:显示磁盘空间使用情况

一、df 命令简介 ​df​命令用于显示文件系统的磁盘空间利用情况&#xff0c;包括文件系统的总空间、已用空间、可用空间以及挂载点信息。通过df​命令&#xff0c;用户可以快速了解系统中各个文件系统的空间使用情况。 ‍ 二、df 命令参数 df [选项] [目录/驱动器]选项&am…...

深入解析Go语言的容器包

在Go语言中&#xff0c;container标准包为开发者提供了三个非常有用的数据结构&#xff1a;堆&#xff08;heap&#xff09;、链表&#xff08;list&#xff09;和环&#xff08;ring&#xff09;。这些数据结构的实现分别位于container/heap、container/list和container/ring中…...

STM32 + W5500 实现HTTPS !

两点: 1. 让我们先站在操作系统之上的网络协议栈再之上来思考…… 2. 我们先简单粗暴地理解为:http + (加密)= https 先弄一个简单的HTTP网络客户端,连接服务器并读取默认页面。该应用程序可能如下所示: #include <sys/types.h> #include <sys/socket.h> …...

使用DuckDuckGo搜索API进行高效信息检索:Python实践指南

使用DuckDuckGo搜索API进行高效信息检索&#xff1a;Python实践指南 引言 在当今信息爆炸的时代&#xff0c;快速准确地获取所需信息变得越来越重要。DuckDuckGo作为一个注重隐私的搜索引擎&#xff0c;提供了强大的搜索API&#xff0c;让开发者能够轻松地将搜索功能集成到自…...

UE4_后期处理_后期处理材质四—场景物体描边

一、效果如下图&#xff1a; 二、分析&#xff1a; 回顾复习&#xff1a;在后期处理材质三中&#xff0c;我们通过计算开启自定义深度通道物体的像素点上下左右4个像素SceneTextureCustomDepth深度之和来判断物体的外部&#xff08;包含物体的边&#xff09;和内部&#xff0c…...

华为OD机试 - 推荐多样性(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…...

梧桐数据库(WuTongDB):CBO(Cost-Based Optimizer)基于代价的优化器技术简介

CBO&#xff08;基于代价的优化器&#xff0c;Cost-Based Optimizer&#xff09;是现代数据库系统中最广泛使用的查询优化器之一。它通过计算执行查询时可能消耗的资源&#xff08;如CPU、内存、I/O&#xff09;来选择最优的执行计划&#xff0c;以提高查询性能。 1. CBO 的工…...

深入探索Go语言中的函数:匿名函数、指针参数与函数返回

1. Go语言中的函数 函数是任何编程语言中的核心元素&#xff0c;它们帮助我们将大型程序分解为更小的、易于管理的部分。在Go语言中&#xff0c;函数是通过 func 关键字定义的。理想的函数应当是独立的&#xff0c;完成单一任务。如果你发现某个函数正在执行多个任务&#xff…...

Android12_13左上角状态栏数字时间显示右移动

文章目录 问题场景解决问题 一、基础资料二、代码追踪三、解决方案布局的角度解决更改paddingStart 的默认值设置marginLeft 值 硬编码的角度解决 问题场景 1&#xff09;早期一般屏幕都是方形的&#xff0c;但是曲面屏&#xff0c;比如&#xff1a;好多车机Android产品、魔镜…...

望繁信科技携流程智能解决方案亮相CNDS 2024新能源产业数智峰会

9月13日&#xff0c;CNDS 2024中国新能源产业数智峰会在北京圆满落幕。本次峰会以“走向数字新能源”为主题&#xff0c;汇聚了来自新能源领域的顶尖领袖、专家学者及知名企业代表&#xff0c;共同探讨数字化技术在新能源行业中的创新应用和发展趋势。上海望繁信科技有限公司&a…...

nginx负载均衡(轮询与权重)

文章目录 1. nginx的介绍2. nginx使用场景3. nginx在windows的下载与安装4. nginx的简单使用5. nginx进行轮询测试6. nginx进行权重测试7. 总结 1. nginx的介绍 Nginx&#xff08;engine x&#xff09;是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也是一个开源的、…...

【计算机网络】网络通信中的端口号

文章目录 一、引入端口号二、端口号的作用三、端口号的确定 在TCP/IP协议中&#xff0c;传输层有两个重要的协议&#xff1a;TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;。TCP用于提供可靠的数据传输&#xff0c;而UDP则适合用于广播…...

Python 解析 JSON 数据

1、有如下 JSON 数据&#xff0c;存放在 data.json 文件&#xff1a; [{"id":1, "name": "小王", "gender": "male", "score": 96.8}, {"id":2, "name": "小婷", "gender&qu…...

利用LlamaIndex构建ARG本地知识库

文章目录 1. 环境准备2. 启用诊断日志3. 配置本地模型4. 配置本地向量模型5. LlamaIndex全局配置6. 创建 PGVectorStore7. 从数据库加载数据8. 文本分割器: SpacyTextSplitter9. 配置管道10. 创建向量存储索引11 .指定响应模式&#xff0c;以及启用流式响应 在现代的人工智能应…...

PCM的缺点

PCM的主要缺点包括需要较大的‌数据传输带宽和‌存储空间&#xff0c;导致无法实现‌高压缩比&#xff0c;相对较低的‌数据压缩效率。‌‌ PCM&#xff08;脉冲编码调制&#xff09;作为一种无损编码技术&#xff0c;虽然能够保留原始信号的完整性&#xff0c;适用于需要高保…...

【C语言】(指针系列四)回调函数+qsort函数

一、回调函数 回调函数就是通过函数指针调用的函数 如果你把函数的指针作为参数传递给另外一个函数&#xff0c;当这个指针被用来调用其所指向的函数时&#xff0c;被调用的函数就是回调函数。回调函数并不是一个单一的函数实现的&#xff0c;而是在某种情况下&#xff0c;编…...

全面理解tensor编程中矩阵的行和列

经常会在编程中遇到理解矩阵行和列的事情。 1、要明确无论这个张量有多少维度&#xff0c;它的矩阵乘法都只能作用于最后两个维度。 例如&#xff1a; import torcha torch.rand([64, 32, 3, 4]) b torch.rand([64, 32, 3, 4])c torch.matmul(a, b.transpose(2, 3)) # 交…...

【Kubernetes】常见面试题汇总(十)

目录 29.简述 Kubernetes 自动扩容机制&#xff1f; 30.简述 Kubernetes Service 类型&#xff1f; 31.简述 Kubernetes Service 分发后端的策略&#xff1f; 32.简述 Kubernetes Headless Service &#xff1f; 29.简述 Kubernetes 自动扩容机制&#xff1f; &#xff08;…...

Jaspersoft Studio 动态字体颜色设置实战指南

1. 为什么需要动态字体颜色&#xff1f; 在报表开发中&#xff0c;数据可视化是提升信息传达效率的关键手段。想象一下&#xff0c;当你的老板查看月度销售报表时&#xff0c;如果所有数字都是千篇一律的黑色&#xff0c;他需要花费多少时间才能找到异常数据&#xff1f;而如果…...

新中大SE系统反月结避坑指南:从月结修复到重新记账的完整操作解析

新中大SE系统月结异常处理实战手册&#xff1a;从错误回溯到数据修正的全流程精解 财务系统的月结操作如同会计周期的"收官之战"&#xff0c;一旦发现历史凭证存在错误&#xff0c;往往让使用者陷入两难境地——既要确保数据准确性&#xff0c;又担心操作不当引发连锁…...

数据库字段ip地址varbinary、inet6_aton()、inet6_ntoa()等

文章目录准备数据inet6_aton()、 inet6_ntoa()其他函数为什么ip地址要用varbinary(16)?其他文档这里主要说下mysql的varbinary字段类型。准备数据 CREATE TABLE user_logs (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,ip VARBINARY(16) NOT NULL COMMENT 存储IPv4/IPv6地…...

Z-Image-Turbo-rinaiqiao-huiyewunv开发者教程:gc.collect()+empty_cache显存防泄漏实践

Z-Image-Turbo-rinaiqiao-huiyewunv开发者教程&#xff1a;gc.collect()empty_cache显存防泄漏实践 1. 项目概述 Z-Image Turbo (辉夜大小姐-日奈娇)是基于Tongyi-MAI Z-Image底座模型开发的专属二次元人物绘图工具。该工具通过注入辉夜大小姐(日奈娇)微调safetensors权重&am…...

uniapp 抖音生态集成实战:从授权登录到内容发布与社交分享

1. 为什么要在uniapp中集成抖音生态&#xff1f; 对于电商类或内容社区类的uniapp应用来说&#xff0c;抖音生态的集成价值主要体现在三个方面&#xff1a;流量获取、用户增长和内容传播。抖音作为国内最大的短视频平台之一&#xff0c;拥有庞大的用户群体和活跃的内容生态。通…...

3步掌握Qwen Code的中文编程体验:母语环境下的智能开发革命

3步掌握Qwen Code的中文编程体验&#xff1a;母语环境下的智能开发革命 【免费下载链接】qwen-code Qwen Code is a coding agent that lives in the digital world. 项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code Qwen Code是阿里云通义千问推出的智能编…...

3步搞定黑苹果:OpCore-Simplify自动化配置工具深度体验

3步搞定黑苹果&#xff1a;OpCore-Simplify自动化配置工具深度体验 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的黑苹果配置而头痛不已…...

S32K144开发环境避坑指南:SDK选择与Segger JLink配置详解

S32K144开发环境避坑指南&#xff1a;SDK选择与Segger JLink配置详解 第一次接触NXP S32K144微控制器时&#xff0c;最令人头疼的莫过于开发环境的搭建。记得去年接手一个汽车电子项目&#xff0c;团队花了整整三天时间才让调试器正常工作——不是因为硬件问题&#xff0c;而是…...

C++多线程编程:为什么compare_exchange_weak比strong更适合循环场景?

C多线程编程&#xff1a;为什么compare_exchange_weak比strong更适合循环场景&#xff1f; 在构建高性能并发系统时&#xff0c;C开发者常常需要在原子操作的精确性和执行效率之间寻找平衡点。compare_exchange系列函数作为无锁编程的核心工具&#xff0c;其强弱两种变体的选择…...

yfinance终极指南:5分钟掌握免费金融数据获取

yfinance终极指南&#xff1a;5分钟掌握免费金融数据获取 【免费下载链接】yfinance Download market data from Yahoo! Finances API 项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance 在金融分析和量化投资领域&#xff0c;高质量的数据是一切分析的基础。…...