我有这样的设置
file.h:
#pragma once
namespace a {
int home(double a, double b, ...
class b {
int la();
};
}
file.cpp
#include "file.h"
using namespace a;
int home(double a, double b, ...) {
//function stuff
}
int b::la() {
home(1, 2, ...)
}
b 实例化并在main中使用,如下所示:
#include "file.h"
b instant;
instant.la()
但是我在使用函数home
的所有地方都遇到了这个链接器错误:
undefined reference to `a::home(double, double, ...)'
In function a::b::la()
我很确定所有的CMakelists都已正确设置,所有内容都包含在内。
但是当我将 file.cpp 更改为名称空间时:
namespace a {
all of the same stuff
}
它运作得很好吗?
为什么会发生这种情况?
答案 0 :(得分:7)
问题出在{。{1}}的文件顶部。这只是将using namespace a;
中的所有定义都引入到您的代码中。因此,当您定义namespace a
时,您没有为int home(double, double, ...)
提供实现,而是创建了另一个函数。然后,您有a::home
和int a::home(double, double, ...)
。
您需要int home(double, double, ...)
或将int a::home(double, double, ...)
文件中的所有内容包装在.cpp
namespace a
下的namespace a { ... }
下。
编辑:您的混淆源于using
声明的作用。它只是从a
命名空间中提取所有内容,并允许您使用它不合格。它不允许您省略定义中的限定条件。
答案 1 :(得分:3)
你需要定义命名空间a
中的函数,因为它是声明的:
namespace a
{
int home(double a, double b, ...) {
//function stuff
}
}
答案 2 :(得分:3)
在namespace a
内的file.cpp包装定义中,它将在命名空间a
中定义它们,链接器可以找到符号。
namespace a{
int home(double a, double b, ...) {
//function stuff
}
int b::la() {
home(1, 2, ...)
}
} // namespace a
节点,using namespace a
未定义您的函数inside namespace a
。
看看google c++ coding style guide,它提供了良好的c ++编码风格。
答案 3 :(得分:2)
home
的定义需要说a::home
,因为它是在其中声明的命名空间。因此未定义引用“a :: home”。