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


	}


评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值