C++ 命名空间std

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 冲突的原因了。


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

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

解决这个冲突就好了。



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fsdgsddaer/article/details/79948957
个人分类: C++
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭