读书人

不使用std:前缀居然可以使用algorit

发布时间: 2012-02-19 19:43:38 作者: rapoo

不使用std::前缀,居然可以使用algorithm中的算法,那位专家可以解释一下?
近期正在学stl,发现如下现象:

第一种现象:
只包括 <algorithm> 头文件,使用其中的算法必须加std::前缀,如下面代码:

#include <algorithm>

void foo()
{
int a[10];
std::find(a, a+10, 4); //这里必须要加std::,否则g++编译失败
} //但VC71不加也编译通过


第二种现象:
如果在包含了别的文件(我试过了 <string> 和 <vector> )就不需要std::前缀了
如下面代码:

#include <algorithm>
#include <vector>

void foo()
{
std::vector <int> a(10);
find(a.begin(), a.end(), 4); //find前加不加std::都可以,
} //vc71和g++都可以编译通过

我查看了VC和g++的头文件,这些算法都是定义在std空间中的,会出现这种
现象,实在是不能理解?
苦恼啊!!

[解决办法]
C++标准规定,对于没有明确指定名字空间的情形,可以考虑其他名字空间,特别是正被传给函数的参数的类型所在的名字空间。

当你给find函数传递参数的时候,首先查找所在作用域有没有此函数声明,如果没有,则看传递参数所在的名字空间有无此函数声明,如果有,则通过

具体的,你可以google一下koenig查找
[解决办法]
当你给find函数传递参数的时候,首先查找所在作用域有没有此函数声明,如果没有,则看传递参数所在的名字空间有无此函数声明,如果有,则通过
~~~~~~~~~~~~~~~~~~~~~~
为啥我给find显式指定模板参数后就编译通不过了??

读书人网 >C++

热点推荐