1

我有一个名为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 );
}

现在,由于对 cnVector::cross(cnVector const&) const; 的未定义引用,main.cpp中的以下代码在第3行中断。 请注意如何识别构造函数实现,而不是识别方法。
cnVector::cross

int main() {
    cnVector v1(1, 0, 0), v2(0, 1, 0);
    cnVector v3 = v1.cross(v2);
}

我还收到一条错误消息警告: inline function 'cnVector cnVector::cross(const cnVector&) const' used but never defined
将实现复制到main.cpp工作。

你能解释一下为什么我可以构造一个cnVector实例但其他方法的实现不被识别吗?

4

1 回答 1

2

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

于 2011-10-25T19:54:46.250 回答