2010-04-11 78 views
6

我是否必须将.cpp中的代码放在相应的.h的命名空间中,或者仅仅使用声明来编写代码就足够了?它应该在名称空间吗?

//file .h 
namespace a 
{ 
/*interface*/ 
class my 
{ 
}; 
} 

//file .cpp 

using a::my; // Can I just write in this file this declaration and 
      // after that start to write implementation, or 
      // should I write: 

namespace a //everything in a namespace now 
{ 
//Implementation goes here 
} 

谢谢。

回答

4

我认为更合适的是围绕所有代码在namespace a { ... }块中的命名空间,因为这是在语义上你在做什么:你正在定义a命名空间中的元素。但是,如果你只是定义成员,那么这两件事情都会起作用。

当编译器发现void my::foo(),它会尝试确定my是,它会发现using a::my,解决因my并了解您所定义的a::my::foo方法。

在另一方面,如果你正在使用免费的功能此方法将失败:

// header 
namespace a { 
    class my { // ... 
    }; 
    std::ostream & operator<<(std::ostream& o, my const & m); 
} 
// cpp 
using a::my; 
using std; 
ostream & operator<<(ostream & o, my const & m) { 
    //.... 
} 

编译器会很乐意翻译上面的代码到一个程序,但它实际上是在做头部被宣告std::ostream& a::operator<<(std::ostream&, a::my const &)文件 - 不执行 - ,并在cpp文件中定义std::ostream& ::operator<<(std::ostream &, a::my const &),这是一个不同的功能。使用Koening查找,当编译器看到cout << obja::myobj,编译器会看在coutmystd,并且a)封闭的命名空间,并会发现有一个a::operator<<说明,但namespace a从未定义。它会编译但不能链接你的代码。

+0

+1。名称空间中的内容在'namespace {}'中。像这样的东西不要求缩进,所以没有任何问题。 – Potatoswatter 2010-04-11 14:06:54

1

如果我理解正确的问题,你可以使用::我,然后就实施方法,如

using a::my; 

void my::doSomething() {} 
0

可以做到这一点有。但是,应该是吗?

这是一种不常见的做法,它可能会导致来自.cc文件中使用的名称空间“a”的每种类型的using a::Type;激增。是否这是一件好事是由你来决定的,但我会投反对票:)

+0

您还可以使用'using namespace a;'并实现代码,而不需要在代码中拥有大的名称空间{}。名称空间声明用于标题。 – luiscubal 2010-04-11 13:39:11

相关问题