• 【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
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

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

    不认识的原因是什么呢?

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

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

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

    不认识_template struct __HTIterator中的typedef HashTable 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);
    		}
    
    
    	}
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
  • 相关阅读:
    提前预体验阿里大模型“通义千问”的方法来了!
    器利而工善,以RPA+LCAP赋能企业司库管理数字化升级
    阿里云2核2G服务器e实例40G ESSD Entry系统盘99元一年
    IP协议详解
    android studio 编译乱码的问题
    QLineEdit 类(行编辑器)
    MySQL的安装和删除
    深度解读《深度探索C++对象模型》之C++虚函数实现分析(一)
    Bootstrap框架
    02_Bootstrap基础组件02
  • 原文地址:https://blog.csdn.net/NiNi_suanfa/article/details/138213115