首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

不使用std:前缀,居然可以使用algorithm中的算法,那位专家可以解释一下?该怎么解决

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

不使用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显式指定模板参数后就编译通不过了??

热点排行