草庐IT

NameSpace

全部标签

c++ - 未命名的命名空间访问规则

我正在查看C++03标准中的7.3.1.1部分,希望找到一些关于在未命名命名空间中定义的项的访问规则的描述。对于未命名的命名空间,规则似乎有点不同,因为您不能完全限定对一个项目的访问。我知道至少在同一个翻译单元中,人们可以访问未命名namespace中的项目,就好像它们不在namespace中一样。例如:namespace{intfoo;}voidsomething(){foo=4;}如果命名空间有名称,则无法执行此操作。那么,对于这些适用于未命名命名空间的异常(exception)规则,标准中定义的规则在哪里? 最佳答案 匿名命名

c++ - 作为模板参数的内部类型

ISO98/03标准(第14.3.1节)似乎禁止使用具有内部链接的类型作为模板参数。(参见下面的示例。)C++11标准没有。G++-使用旧标准-允许它。是我误读了03标准,还是g++只是放任自流?namespace{structhidden{};}templatestructS{Tt;};intmain(){Ss;return0;} 最佳答案 你是对的,C++03不允许使用具有内部链接的类型作为模板类型参数,而C++11允许。不过,我似乎记得,匿名命名空间内的定义仍然具有外部链接。是的,第3.5节[basic.link]说Aname

c++ - 我应该将 "using namespace"放在 C++ 中的命名空间内部还是外部

我的导师在代码审查中这样修改了我的代码:usingnamespaceA;//definedinotherfilesnamespaceB{//dosomething}而不是像这样:namespaceB{usingnamespaceA;//dosomething}将using命名空间放在命名空间之外是否有任何技术原因? 最佳答案 在头文件中,您不应该在全局范围内使用usingnamespaceN;指令。它将在所有客户端代码上强制使用来自N的大量标识符。但是将它放在命名空间X中也可以。请记住,执行usingnamespaceX;的客户端代

c++ - 匿名 namespace 内部/外部的 Typedef?

在.cpp文件中,这两种方式有什么区别/偏好吗?//filescopeoutsideanynamespaceusingX::SomeClass;typedefSomeClass::BufferMyBuf;速度/速度namespace{//anonymoususingX::SomeClass;typedefSomeClass::BufferMyBuf;} 最佳答案 我会说第二种用法相当不常见,至少在我目前看到的代码中是这样(而且我已经看到相当多的C++代码)。您能解释一下第二种技术背后的原因吗?您通常会在C++实现文件中使用匿名命名空

c++ - 非本地 C++11 lambda 是否存在于匿名 namespace 中?

GCC4.8的最新版本在头文件中提供了以下代码:autoL=[](){};structS{decltype(L)m;};以下警告:test.hpp:3:8:warning:'S'hasafield'S::m'whosetypeusestheanonymousnamespace[enabledbydefault]structS^为什么编译器会考虑使用匿名命名空间的lambda类型?我将lambda设为全局,我没有在任何地方使用匿名命名空间。更新:即使我将lambda放在显式命名空间中,编译也会给出相同的警告,如下所示:namespaceN{autoL=[](){};}structS{de

c++ - 命名空间别名范围问题

我有一个头文件,我希望在其中定义类时使用namespace别名。但是,我不想将此别名暴露给包含头文件的任何内容。//foo.hnamespacequx=boost::std::bar::baz::qux;//!exposedtotheworldclassfoo{//can'tputanamespacealiashere//stuffusingqux::};我如何才能为类声明命名空间而不会泄露到任何地方? 最佳答案 namespaceMyClassSpace{namespacequx=boost::std::bar::baz::qux

c++ - 使用命名空间标准和库

为什么我们既需要“头文件”又需要usingnamespace任何库函数的标记才能正确执行。例如cout除非我们使用iostream否则将无法工作.除非我们使用“使用命名空间标准”,否则它也不会工作。我的问题是为什么我们需要两者的结合usingnamespacestd以及#include对于cout执行成功? 最佳答案 包含库header可使库功能对您的程序代码可见。否则,您的程序甚至不知道库的存在。这是必要的部分。编写usingnamespacestd只允许您编写cout而不是全名std::cout。这是一个方便,仅此而已。

c++ - 继承和命名空间

我正在尝试使用一些namespace使用我的第一个有用的面向对象程序。我有一个基类B,它位于命名空间NS中。如果我尝试从中继承基类获得继承工作,我应该在类decleration中使用NS::B,如下所示,真的是这样吗?或者对于这种继承语法是否有更广泛接受的语法?namespaceNS{classD:publicNS::B{...};}最好的,乌穆特 最佳答案 如果您的D在namespaceNS中,您不必限定NS::B,因为D和B在同一个命名空间中。您可以只使用classD:publicB。

c++ - 我应该在实现文件中使用未命名的 namespace 吗?

我在一个外部*.cpp文件中定义了一些函数(这里不涉及类),当然还有一个合适的*.h文件。*.cpp文件中的某些函数仅在该*.cpp文件中无处使用。*.h文件中甚至没有提及它们。我应该将这些函数放入一个未命名的命名空间中,还是它们可以紧挨着其他函数存在?如果是这样,为什么我需要为它们使用一个未命名的命名空间?我看不出有什么问题,因为无论如何都无法从外部访问这些功能。 最佳答案 如果您希望它们对那个编译单元真正私有(private),请将它们放在一个匿名命名空间中。如果您不这样做,那么其他人可以在别处声明这些函数并显式使用它们。举个例

c++ - 为什么 ADL 优先于 'std namespace' 中的函数,但等于用户定义的命名空间中的函数?

我有两个ADL片段用于演示目的。这两个片段都已由VC10、gcc和comeauC++编译器编译,结果对于所有三个都是相同的。针对用户定义命名空间的using指令的ADL:#includenamespaceN{structT{};voidswap(T,T){}}namespaceM{voidswap(N::T,N::T){}}intmain(){usingM::swap;N::To1,o2;swap(o1,o2);}编译结果:errorC2668:'M::swap':ambiguouscalltooverloadedfunctioncouldbe'voidM::swap(N::T,N::