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