实现在匿名命名空间中声明的函数时未定义的引用链接器错误

时间:2011-05-03 08:16:36

标签: c++ namespaces

在.hpp中的匿名命名空间中定义函数签名时,将该函数的实现放在.cpp中是否有效?当我这样做时,我得到一个未定义的引用错误。

示例:

//hpp
#ifndef __BAR_HPP_
#define __BAR_HPP_
namespace foo
{
   namespace 
   {
       struct Bar
       {
           void func();
       };
   }
}
#endif

//cpp  
using foo;

void Bar::func()
{
    //...
}

1 个答案:

答案 0 :(得分:5)

想一想:

namespace foo
{
    struct Bar
    {
        void func();
    };
}
void Bar::func() { /*impl...*/ }

您的代码不起作用的原因与此代码没有相同的原因 - 定义是在错误的范围内提供的。我们需要的是:

void foo::Bar::func() { /*impl...*/ }

但是你用什么来代替foo::来引用匿名命名空间的名称?它没有。

底线:无法在匿名命名空间内声明某些内容,然后在其他位置定义它,因为没有用于指定正确范围的机制。