2013-12-07 31 views
0

为了使头文件中的类定义保持干净,我决定将模板化函数的实现移动到另一个*.h文件中,该文件包含在主标题中。现在我想在那里使用using namespace,以使代码更具可读性。在模板实现文件中使用名称空间

但是使用名称空间会影响整个应用程序,因为文件被包含在标题中,而标题本身包含在整个应用程序中。命名空间的using将散布在文件之外。

我该如何处理?

+3

“使用名称空间XX”仅扩展到包含“使用名称空间”的作用域。因此,例如,如果你在方法定义中使用'namespace',它就不会“溢出”。不幸的是,你不能在'class'级别使用这些。 (即'class foo {using namespace std; ...}') –

+0

是在命名空间中定义的类吗? – elyashiv

+0

@JoeZ我是否可以用'{''}''将所有内容封装在模板文件中以创建一个封装范围? – danijar

回答

2

你可以把里面using namespace XX函数定义将使用声明的范围限定为该功能:

int func(...args...) 
{ 
    using namespace std; 
    // ... body of function 
} 
1

使用命名空间别名。

namespace submod_ = topspace::other_project::module::submodule; 

然后你可以使用submod_无论你需要很长的命名空间。

这要求您仍然使用submod_您将拥有较长的命名空间限定符。从这个意义上说,它并不完全回答你的问题。但我会争辩说,资质的明确性有助于可读性,并有助于防止错误发生。

有一些StackOverflow问题的实例,其中“using”声明引入了代码作者没有意识到的“潜伏”函数。

+0

我主要关心的是名称空间的使用会扩散到包含我的标题的其他文件。我想,这与别名是一样的。 – danijar

+0

我明白了。我认为名称空间别名传播不那么危险。使用'using'指令时,函数和类型会静默地添加到客户端代码中的查找集(即包含头的代码)中。使用名称空间别名时,客户端代码需要使用'submod _ ::'别名(在本例中)主动为类型或函数加上前缀。 – NicholasM

0

您可以将using namespace在 '主头' 的namespace

Header.h

#include <string> 

namespace Test 
{ 
    using namespace std; 

    string f() 
    { 
     return "Test"; 
    }; 
} 

的main.cpp

#include "Header.h" 

int main() 
{ 
    Test::f(); 

    string test;  // Error: identifier "string" is undefined 
    std::string test; 

    return 0; 
} 
+0

好的,但我正在谈论模板实现,据我所知,它们必须包含在标题的结尾。 – danijar

+0

@danijar这个例子适用于各种实现。因此,您还可以将'using namespace'放置在模板化函数标题的'namespace'中。 –

+0

嗯,目前有不住在一个命名空间。我会考虑改变这一点。 – danijar

相关问题