欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++ 命名空间std

程序员文章站 2022-05-31 23:29:40
...
std::cout<<"hello world"<<std::endl;

前缀std:: 指出名字cout 和 endl 是定义在名为std 的命名空间(namespace) 中的。

命名空间可以避免命名冲突。

标准库定义的所有名字都在命名空间std 中。


1. 由命名空间引发的问题

看一段程序,程序没有实际意义,旨在说明问题:

//paraTest.h

#ifndef PARATEST_H
#define PARATEST_H
#include <vector>

void sFunction(std::vector<int> &vi);

#endif
//paraTest.cpp

#include "paraTest.h"
#include <algorithm>
void sFunction(std::vector<int> &vi){
	sort(vi.begin(),vi.end());
}
//main.cpp

#include "paraTest.h"
#include <iostream>
using namespace std;

int main(){
	vector<int> vi;
	vi.push_back(13);
	vi.push_back(14);
	vi.push_back(66);
	vi.push_back(25);

	vi.push_back(2);
	sFunction(vi);
	for(int i=0;i<vi.size();++i)
		cout<<vi[i]<<' ';
	cout<<endl;
	return 0;
}
最后一个CMakeLists.txt,需要回顾cmake看这里
#CMakeLists.txt

cmake_minimum_required(VERSION 2.6)

project(pro)
add_executable(test2 main.cpp paraTest.cpp)

采用out-of-source 方式构建:

#在顶层目录,CMakeLists所在目录
mkdir build
cd build
cmake ..
make 
./test2

然后,可以看到vector 中的元素从小到大输出了。

注意到:在paraTest.h 和 paraTest.cpp 文件中,vector 前面都有 命名空间std:: 前缀。

如果不加,会报错:

error: ‘vector’ was not declared in this scope
/home/mitre/cppTest/vector/paraTest.h:7:16: note: suggested alternative:
In file included from /usr/include/c++/5/vector:64:0,
                 from /home/mitre/cppTest/vector/paraTest.h:3,
                 from /home/mitre/cppTest/vector/main.cpp:1:
/usr/include/c++/5/bits/stl_vector.h:214:11: note:   ‘std::vector’

好习惯:

  1.  不要在头文件里 写using namespace XXX; 这样的语句。因为一旦头文件被别的源文件包含,XXX命名空间直接就成为本源文件的命名空间了,会容易引起命名冲突。
  2.  还可以在源文件中这样写:using std::vector; using std::map; using std::string 等等这样写法。

  3.  还可以在源文件的局部作用域 中写using,比如函数中

2. 总结

  • 不要在头文件中使用命名空间
  • 标准库定义的所有名字都在命名空间std 中

今天,我找到了那个和C++11 冲突的原因了。

C++ 命名空间std

第8行,这个命名空间boost,是skill.h 文件中 类型vector 和 shared_ptr 的命名空间。

boost::shared_ptr 和C++11 特性中std::shared_ptr 冲突。

解决这个冲突就好了。