泪目!关于命名空间冲突问题,我卡了好长时间。。。。。

本文深入探讨了C++命名空间的概念及其在解决命名冲突中的作用,通过实例分析了自定义类与标准库冲突的原因,并提供了有效的解决策略。

起因

在学C++的STL模板中的string模板的时候,想自己模拟实现一个string类,于是代码是这样写的。我有个坏习惯,就是当报错的时候,第一先想的是自己代码哪里的问题,当时报错的时候,先把代码都逻辑走了一遍,能优化的就优化,各种版本都试了一次。。。。。。
在这里插入图片描述

类的头文件

#pragma once
#include <iostream>
#include <vld.h>
using namespace std;

class string{
	//内容就先不显示了
};

主函数

#include <iostream>
#include <vld.h>
using namespace std;
#include "string.hpp"

int main()
{
	string str;
	return 0;
}

运行结果

在这里插入图片描述

报错的原因

在这里插入图片描述

分析

在C++中有一个 命名空间的概念,我自己在自定义STL中的类的时候,在两个文件中都展开了C++中的std命名空间。。。

展开命名空间后,我自己写的类名与STL中string类的类名冲突了,就会报这种不明确的错误

改正方式

  1. 修改自定义的类名,不能和std中的类名冲突
  2. 不全部展开std中的所有函数,用到那个就展开哪个
  3. 把自定义的类放在自己定义的一个命名空间中

C++命名空间

C++与C相比多了一个命名空间,有了命名空间,我们就可以在一个函数中定义多个相同的变量名(合理的)。
命名空间的建立就是为了防止变量,函数名,类的名称因为重复而发生冲突的问题,他的出现就是为了对标识符的名称进行本地化,避免命名冲突发生的报错。

命名空间的定义

普通的命名空间

namespace name // name为命名空间的名称
{
	// 命名空间中的内容,既可以定义变量,也可以定义函数
	//还可以定义类
	int a;
	int Swap(int& a, int& b)
	{
		a = a ^ b;
		b = a ^ b;
		a = a ^ b;
	}
	class string
	{
	};
}

嵌套型命名空间
类似于套娃。。。

namespace name // name为命名空间的名称
{
	namespace name1
	{
	}
	namespace name2
	{
	}
}

如果我们定义了几个重复的命名空间,这也是允许的,编译器会把这些命名空间中的内容融合在一个命名空间中。

展开命名空间的几种方式

  1. 预作用限定符
std::cin
  1. using 展开命名空间中的成员
using std::cin
  1. using namespace 展开命名空间中的全部内容
using namespace std

所以说以后还是尽可能少展开全部的命名空间吧,用到那个就展开那个。。。。。
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值