我有一个名为 cnVector.h 的头文件,其实现是用 cnVector.cpp 编写的。 这两个文件位于同一目录中。
cNormalCBP/
+ src/
+ cNormal/
+ cnUtils/
- cnVector.h
- cnVector.cpp
- main.cpp
标题包含一个简单的类定义。
class cnVector {
public:
cnVector(double, double, double);
inline cnVector cross(const cnVector&) const;
};
.cpp 文件中的实现如下:
#include "cnVector.h"
/* constructor */ cnVector::cnVector(double x, double y, double z)
: x(x), y(y), z(z) {
}
cnVector cnVector::cross (const cnVector& vOther) const {
return cnVector(
y * vOther.z + z * vOther.y,
z * vOther.x + x * vOther.z,
x * vOther.y + y * vOther.x );
}
现在, main.cpp 中的以下代码在 3 行中断,因为未定义对cnVector :: cross(cnVector const&)const的引用;
请注意如何识别构造函数实现,而不是cnVector::cross
方法。
int main() {
cnVector v1(1, 0, 0), v2(0, 1, 0);
cnVector v3 = v1.cross(v2);
}
我还收到错误消息警告:内联函数'cnVector cnVector :: cross(const cnVector&)const'已使用但未定义。
将实现复制到 main.cpp 中。
你能解释一下为什么我可以构建一个 cnVector 实例但是 其他方法的实施不被认可?
答案 0 :(得分:2)
将内联函数移动到头文件中。内联函数需要在头文件中使用它们的全部定义,因为它们与代码的其余部分集成在一起。编译器(可能)会尝试在调用函数的所有位置插入代码,因此它需要在头文件中可见,类似于模板需要完全存在于头文件中。