【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);
		}


	}


最近更新

  1. TCP协议是安全的吗?

    2024-04-26 14:40:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-26 14:40:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-26 14:40:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-26 14:40:02       20 阅读

热门阅读

  1. Redis系列:HyperLogLog实现海量数据基数统计

    2024-04-26 14:40:02       17 阅读
  2. 大文件的分片上传和断点上传

    2024-04-26 14:40:02       17 阅读
  3. js将后端返回的blob请求下载

    2024-04-26 14:40:02       15 阅读
  4. Haystack

    Haystack

    2024-04-26 14:40:02      16 阅读
  5. SpringBoot集成rabbitMq

    2024-04-26 14:40:02       16 阅读
  6. python的练习

    2024-04-26 14:40:02       12 阅读
  7. 多线程(74)分段锁

    2024-04-26 14:40:02       13 阅读
  8. Ubuntu20.04下 Django框架搭建、部署、上线项目

    2024-04-26 14:40:02       14 阅读
  9. 一文掌握python面向对象魔术方法(二)

    2024-04-26 14:40:02       13 阅读
  10. C++ 中容器的种类

    2024-04-26 14:40:02       14 阅读
  11. 静态网卡配置centos、kali、ubantu

    2024-04-26 14:40:02       12 阅读