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


	}


  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
根据提供的引用内容,"Error while parsing file"是Qt报错信息中的一部分,意思是在解析文件时出现了错误。具体而言,"Error while parsing file C:\Users\PC\Desktop\资料\声学\c++代码\sound2\sound.pro. Giving up."表示在解析文件C:\Users\PC\Desktop\资料\声学\c++代码\sound2\sound.pro时出现了错误,并且Qt放弃了继续解析。 这个错误通常是由于文件中存在语法错误或配置问题导致的。可能的原因包括: - 文件路径错误:检查文件路径是否正确,确保文件存在并且路径没有拼写错误。 - 文件格式错误:检查文件的格式是否正确,例如是否遵循了Qt项目文件的规范。 - 缺少依赖项:检查项目文件中是否引用了不存在的文件或模块。 - 编译器配置问题:检查Qt的编译器配置是否正确,确保编译器可用并已正确设置。 为了解决这个问题,你可以尝试以下几个步骤: 1. 检查文件路径:确保文件路径正确,没有拼写错误,并且文件存在。 2. 检查文件格式:确保项目文件遵循了Qt项目文件的规范,检查文件中是否存在语法错误。 3. 检查依赖项:检查项目文件中是否引用了不存在的文件或模块,确保所有依赖项都正确配置。 4. 检查编译器配置:确保Qt的编译器配置正确,检查编译器是否可用并已正确设置。 如果以上步骤都没有解决问题,你可以尝试重新创建一个新的项目文件,并逐步添加代码和配置,以确定具体是哪一部分引起了错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值