起因
在学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类的类名冲突了,就会报这种不明确的错误
改正方式
- 修改自定义的类名,不能和std中的类名冲突
- 不全部展开std中的所有函数,用到那个就展开哪个
- 把自定义的类放在自己定义的一个命名空间中
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
{
}
}
如果我们定义了几个重复的命名空间,这也是允许的,编译器会把这些命名空间中的内容融合在一个命名空间中。
展开命名空间的几种方式
- 预作用限定符
std::cin
- using 展开命名空间中的成员
using std::cin
- using namespace 展开命名空间中的全部内容
using namespace std
所以说以后还是尽可能少展开全部的命名空间吧,用到那个就展开那个。。。。。

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

被折叠的 条评论
为什么被折叠?



