2011-08-24 60 views
0

我有时在嵌套的命名空间声明类和当涉及到确定其成员函数,我不希望有资格每一个与这些嵌套的命名空间名称,特别是如果他们长期ISH 。定义命名空间成员VS免费功能无资质

在我定义成员函数之前添加“using namespace”(或者,为了更精确地定位,使用:: SomeClass),似乎不需要限定每个定义,但我无法找到规范中的任何位置这保证了这一点,我担心这可能是一种只适用于GCC的行为。我注意到,在定义自由函数(?)时,似乎没有类似的机制来跳过添加限定符的需要。

至于我的意思的例子:

页眉:

// example.h 
namespace SomeNamespace 
{ 
    class SomeClass 
    { 
    public: 
     void someMemberFunction(); 
    }; 

    void someFreeFunction(); 
}; 

实现:

// example.cpp 
#include "example.h" 

using namespace SomeNamespace; 

void SomeClass::someMemberFunction() 
{ 
    // OK: seems to define SomeNamespace::SomeClass::someMemberFunction(), 
    // even though we didn't qualify it with SomeNamespace:: 
} 

void someFreeFunction() 
{ 
    // Not what we wanted; declares and defines ::someFreeFunction(), not 
    // SomeNamespace::someFreeFunction() (quite understandably) 
} 

int main() 
{ 
    SomeClass a; 
    a.someMemberFunction(); // Ok; it is defined above. 
    SomeNamespace::someFreeFunction(); // Undefined! 
    return 0; 
} 

所以我的问题:是definining SomeClass的:: someMemberFunction上述方式()合法,并在规范中提到这一点?如果合法,这是可取的吗?它确实减少了杂乱! :)

非常感谢:)

+2

只是出于兴趣:什么是问题把这些定义放在一个常规的“命名空间”中? (就像你对声明做的那样) – ereOn

+0

只要你没有在头文件中使用'namespace ...',你应该没问题。无论如何,这就是'using'指令的用例。 – RedX

回答

0

当你定义一个成员函数,编译器意识到它是一个必须属于先前声明的类成员函数,所以它看起来是阶级起来,作为标准的第9.3.5规定:

如果一个成员函数的定义词汇同级车 定义之外,成员函数名称应使用::运算同级车 名进行限定。 [注:在一个成员函数 定义中(即,包括 默认参数(8.3.6参数声明子句中),或在构件的功能体,或者,对于 构造函数的名称(12.1 )中,在MEM-初始化表达式 (12.6.2))如在3.4中描述查找。 ] [实施例:

struct X { 
    typedef int T; 
    static T count; 
    void f(T); 
}; 

void X::f(T t = count) { } 

成员函数X类的f在全局范围内所定义;所述 符号X::f指定该功能fX类和 在X类的范围的部件。在函数定义,参数 类型TX类中声明的typedef的构件T和 默认参数计数指的是静态数据成员计数X类中声明 。 ]

基本上,你在做什么是好的。然而,还有另外一个(最好)的方式使用嵌套的命名空间,或用长名称(或两者)命名空间当在杂波削减 - 定义一个别名:

namespace short_name = averylong::nested::namespacename; 
+0

谢谢!这不是很清楚,我从标准-ESE,虽然,“SomeClass的”中的“SomeClass的::的someMethod”将在3.4中描述的方式进行查找。这绝对是这种情况吗? –

+1

但不要使用short,因为这是一个数据类型,并且是这样一个保留关键字。 – RedX

+0

@RedX:很好,固定。 –

2

也许我得到这个错误的,但如果您有:

// example.h 
namespace SomeNamespace 
{ 
    class SomeClass 
    { 
    public: 
     void someMemberFunction(); 
    }; 

    void someFreeFunction(); 
}; 

你也可以简单的写:

#include "example.h" 

// example.cpp 
namespace SomeNamespace 
{ 
    void SomeClass::someMemberFunction() 
    { 
    } 

    void someFreeFunction() 
    { 
    } 
} 
+0

这当然是一种方法(似乎有一种方法可以保证工作),但我真的不喜欢它增加的混乱(特别是如果你有嵌套的命名空间)。 –

+1

@MrLunchtime:如果它只是一个视觉问题(“我真的不喜欢它添加的混乱”),也许问题不在代码中,而是在文本编辑器的配置中?我通常使用这样的命名空间(有时是嵌套的),并且忽略命名空间声明中添加的3行,它看起来都是一样的。 – ereOn

+0

这会工作,但(纯粹的原因纯粹是一个味道问题),我想我会喜欢做“使用<嵌套命名空间> :: SomeClass”方法。谢谢,虽然:) –