【C++报错】error C2143:语法错误:缺少“ : ”(在“<” 的前面)[ 相互引用问题 ]

2024-04-26 15:52

本文主要是介绍【C++报错】error C2143:语法错误:缺少“ : ”(在“<” 的前面)[ 相互引用问题 ],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里写自定义目录标题

  • 情景再现
  • 问题分析
    • 是经典的互相引用问题
  • 解决方案


情景再现

在这里插入图片描述

问题分析

	template<class K,class T,class KeyofT,class Hash>class __HTIterator{typedef HashNode<T> Node;typedef HashTable<K, T, KeyofT, Hash> HT;     【★】typedef __HTIterator<K, V, KeyofT, Hahs> Self;Node* _node;        // 保留指针指向当前遍历到的节点HT* _ht;         // 保留底层vector<>的地址,方便到下一个位置i去遍历节点__HTIterator(Node* node,HT* ht):_node(node)			// 从HashTable begin()那取得头节点,_ht(ht)			// 并将this指针(HashTable的对象ht)传入储存{}}template<class K,class T,class KeyofT,class Hash>class HashTable{typedef HashNode<T> Node;public:typedef __HTIterator<K, T, KeyofT, Hash> iterator;     【★】iterator begin(){for (size_t i = 0; i < _tables.size(); i++)		 // for循环:遍历底层vector<>,直至遍历到第一个桶的第一个节点,直接return该节点和this指针(HashTable底层结构vector<>){if (_tables[i])  {return iterator(_tables[i],this);      // 传通过HashTable实例化出的对象}}return end();}iterator end(){return iterator(nullptr,this);}

经过检查后,并无缺少 “ : ” 的语法问题,通常这种情况则是编译器不认识这一段话:该类型编译器不认识 。

不认识的原因是什么呢?

  1. 检查是否有定义出错
    也没有定义出错。

  2. 声明和使用的顺序:先声明,再使用。编译器为了提高编译速度,只向上找,不向下找

    • 在类里面不用在意,当作一个类域(一个整体),编译器会在整个类域里面进行搜索

不认识_template<class K, class T, class KeyOfT, class Hash> struct __HTIterator中的typedef HashTable<K, T, KeyOfT, Hash> HT;
那么则将HashTable定义在__HTIterator之前,但__HTIterator中的HashTable<>类型又也会出现同样的问题。

是经典的互相引用问题



解决方案

前置声明:是模板就带上模板参数一起声明 。

// 前置声明template<class K, class T, class KeyofT, class Hash>class HashTable;template<class K,class T,class KeyofT,class Hash>class __HTIterator{typedef HashNode<T> Node;typedef HashTable<K, T, KeyofT, Hash> HT;     【★】typedef __HTIterator<K, V, KeyofT, Hahs> Self;Node* _node;        // 保留指针指向当前遍历到的节点HT* _ht;         // 保留底层vector<>的地址,方便到下一个位置i去遍历节点__HTIterator(Node* node,HT* ht):_node(node)			// 从HashTable begin()那取得头节点,_ht(ht)			// 并将this指针(HashTable的对象ht)传入储存{}}template<class K,class T,class KeyofT,class Hash>class HashTable{typedef HashNode<T> Node;public:typedef __HTIterator<K, T, KeyofT, Hash> iterator;     【★】iterator begin(){for (size_t i = 0; i < _tables.size(); i++)		 // for循环:遍历底层vector<>,直至遍历到第一个桶的第一个节点,直接return该节点和this指针(HashTable底层结构vector<>){if (_tables[i])  {return iterator(_tables[i],this);      // 传通过HashTable实例化出的对象}}return end();}iterator end(){return iterator(nullptr,this);}}

这篇关于【C++报错】error C2143:语法错误:缺少“ : ”(在“<” 的前面)[ 相互引用问题 ]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/938004

相关文章

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable