在Code :: Blocks中链接.cpp文件的问题

时间:2011-10-25 19:49:44

标签: c++ linker undefined-reference

我有一个名为 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 实例但是   其他方法的实施不被认可?

1 个答案:

答案 0 :(得分:2)

将内联函数移动到头文件中。内联函数需要在头文件中使用它们的全部定义,因为它们与代码的其余部分集成在一起。编译器(可能)会尝试在调用函数的所有位置插入代码,因此它需要在头文件中可见,类似于模板需要完全存在于头文件中。