在命名空间内定义函数时抛出链接器错误?

Linker errors thrown when defining a function inside of a namespace?

为什么我无法在 .cpp 文件(不是 main.cpp)的命名空间内定义函数?

例如,假设我想将我的代码拆分为 2 个不同的文件,main.cpp,然后是 lib.cpp(以及关联的 lib.h 文件)。

以下设置会引发链接器错误: lib.h:

#ifndef LIB_H_
#define LIB_H_
namespace a{
void foo();
}
#endif

lib.cpp:

#include "lib.h"
using namespace a;
void foo(){
std::cout<<"Hello World!"<<std::endl;
}

main.cpp:

#include "lib.h"
int main(){
a::foo();
return 0;
}

不过,我能想到的几乎所有其他变体都有效。

在我看来这可能是约定俗成的事情?鼓励人们使用 classes 或在 .h 文件中完整定义函数?我收到的链接器错误是“架构的未定义符号(a::foo())...”

为什么会这样? 我正在 mac 使用 CLion。

你必须添加

target_link_libraries(<name of your executable> <name of your library>)

到link库符号和函数到你的可执行文件。

并且您正在全局命名空间中定义该函数。

lib.cpp

中像这样定义函数
void a::foo() {
    ...
}

查看下面代码中的注释

lib.h

#ifndef LIB_H_ 
#define LIB_H_ 
namespace a{ 
    void foo(); // declaring a::foo()
} 
#endif

lib.cpp

#include "lib.h" 
using namespace a; 
void foo(){ // defining ::foo() and thats why calling foo() without namespace a works
    std::cout<<"Hello World!"<<std::endl; 
}

using namespace a; 不是在命名空间内定义函数的方法。

语法与声明相同:namespace a { ... }

#include "lib.h"
namespace a {
    void foo(){
        std::cout<<"Hello World!"<<std::endl;
    }
}

更多详情请参考:Namespaces.