2013-02-23 35 views
0

为什么使用向量类我应该编写名称空间说明符std::vectorstd::find函数我可以省略std::?有什么不同?两者都是在std命名空间中定义的,对吗?C++:类和函数的名称空间说明符

+0

这里的内容是什么?示例源代码? – Cornstalks 2013-02-23 21:07:19

回答

4

为什么使用Vector类我应该写名字空间说明符的std ::向量但对于标准::发现功能我可以省略std ::?

一般情况下,这是不正确的。

有什么区别。两者都是在std命名空间中定义的,对吗?

是的,并且在原则上没有什么区别。每款C++ 11标准的17.6.1.1/2:

所有图书馆的实体,除了宏,新的运营商和operator delete的命名空间std或命名空间的嵌套命名std内内定义。 [...]

但是,你必须记住,异常是由Argument-Dependent Lookup规则允许:感谢这个查询技术,它是没有必要明确指定一个函数的命名空间,因为名称将在您提供给该函数的参数的命名空间中查找。

因此,如果功能发生在相同的命名空间的任何参数来定义,它将由编译器发现,尽管它的名字不与空间限定它属于:

namespace N 
{ 
    struct X { }; 

    void foo(X) { } 
} 

int main() 
{ 
    N::X x; 
    foo(x); // OK 
} 

因此,如果您正在调用std::find()一些论点是在std命名空间中定义的类型的情况下,你会不会需要调用资格find()std::。例如:

#include <vector> 
#include <algorithm> 
#include <iostream> 

int main() 
{ 
    std::vector<int> v { 1, 2, 3 }; 
    auto i = find(v.begin(), v.end(), 2); // ADL applies if the result of 
              // v.begin() and v.end() is an 
              // iterator whose type is defined 
              // in the std namespace! 
    std::cout << *i; 
} 

显然,这不能适用于接受没有参数的函数。在这种情况下,名称空间限定始终是必要的,当然,除非调用的一点是,命名空间中(虽然你不能任何添加到std命名空间,从std命名一些模板可以专门)。

0
你包括LIBRAIRIE你的程序的启动(STD命名空间)

然后afther你不需要使用所有的时间STD字 但在实际所有的对象都是这样的std ::法院给std :: cin

STD是C++

soorry,我的英语需要校正的基本LIBRAIRIE之一;)

1

这取决于您如何拨打std::find ...例如,如果你从std容器传递了一些迭代器,这个函数将被ADL找到,否则你必须添加std::来调用它。

0

由于某些原因,STL选择在全局名称空间中公开许多算法(in)。这就是为什么你可以写查找(...)或变换(...)。载体未曝光,因此您必须执行std::vector<>()。或者您可以在文件顶部使用std::vector;

+0

这是不正确的。从C++标准(17.6.1.1/2)开始:“*除宏,运算符new和运算符delete之外的所有库实体都在命名空间std中定义或名称空间中嵌套命名空间std * – 2013-02-23 21:19:51