2014-12-02 69 views
2

请解释我为什么这个代码产生链接错误:C++命名空间分辨率

xxx.h

namespace ns 
{ 
    namespace inner 
    { 
     void func(); 
    } 
} 

xxx.cpp

using namespace ns; 
using namespace inner; //or "using "namespace ns::inner;" results in the same error 

void func() 
{ 
} 

而此代码的工作罚款:

xxx.h

namespace ns 
{ 
    void func(); 
} 

xxx.cpp

using namespace ns; 

void func() 
{ 
} 
+0

尝试在'xxx.cpp'中添加'using ns :: inner :: func;'而不是'using namespace inner;' – 2014-12-02 22:12:55

+2

如果第二个实际上工作。 – 2014-12-02 22:48:29

+0

传统上,会发布有关哪个人正在查询的错误消息。 – 2014-12-02 22:51:33

回答

3

using namespace ...只允许在没有命名空间前缀来引用该命名空间中的名字。你在源代码中定义的任何符号将仍然在他们目前在任何一个命名空间块被定义

要添加函数的定义,你需要内部命名空间中:

// xxx.cpp 

using namespace ns::inner; 
// we are still outside of the namespace, but we can reference names inside. 

namespace ns { namespace inner { 
    // now we can define things inside ns::inner 
    void func() { 

    } 
} 

// now we are at the global level again. 

我猜测你没有将链接器错误移动到外部名称空间,因为你的代码没有引用它,并且它没有被链接到链接阶段。

免责声明:我实际上并不知道如何正确使用作品。

+1

_“要添加该函数的定义,您需要位于内部命名空间内:”_ **或**使用限定名称(例如, void ns :: inner :: func(){}',如果定义与先前的声明不匹配,则会产生一个有用的错误。 – 2014-12-02 23:01:56

1

小故事:using namespace是访问现有声明的一个很好的捷径,但它确实为没有任何以后的声明。 (否则它们显然是完全不明确的!)