【发布时间】:2020-07-25 21:37:50
【问题描述】:
为什么我无法在 .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;
}
不过,我能想到的几乎任何其他变体都有效。
- 在 lib.h 文件而不是 lib.cpp 中定义函数可以工作
- 删除命名空间有效
- 保留命名空间,而是将 foo 作为公共方法 我在主函数中实例化然后调用的类,工作
在我看来这可能是一种约定俗成的事情?鼓励人们使用类或在 .h 文件中完全定义函数?我得到的链接器错误是“undefined symbols(a::foo()) for architecture...”
为什么会这样? 我在使用 CLion 的 Mac 上。
【问题讨论】:
-
你已经声明了一个函数
a::foo,但是你定义了一个全局命名空间函数::foo。您的声明应在namespace { }块内,或声明为void a::foo() { };using namespace声明不足。
标签: c++ cmake header-files clion