C++ 3D 矢量模板

Posted

技术标签:

【中文标题】C++ 3D 矢量模板【英文标题】:C++ 3D Vector Template 【发布时间】:2012-01-17 18:04:35 【问题描述】:

我正在尝试使用模板创建一个 Vector 类来存储对象的 3D 位置。我已经创建了这个类,但是我一直收到错误 LNK2019: unresolved external symbol "public: __thiscall Vector3::~Vector3(void)" (??1?$Vector3@H@@QAE@XZ) 在函数 _main 中引用

这与我在 main 函数中创建 Vector 有关,但我无法弄清楚它有什么问题......这是我的代码:

//Vector3.h
template <typename T>
class Vector3

public:
    Vector3(T elemOne, T elemTwo, T elemThree);
    ~Vector3();

    void display();

protected:
    T x;
    T y;
    T z;
;

//Vector3.cpp Constructor.
#include"Vector3.h"

template<typename T>
Vector3<T>::Vector3(T elemOne, T elemTwo, T elemThree)

    x = elemOne;
    y = elemTwo;
    z = elemThree;


template<typename T>
Vector3<T>::~Vector3()




template<typename T>
void Vector3<T>::display()

    cout << "X: " << x << endl;
    cout << "Y: " << y << endl;
    cout << "Z: " << z << endl;


//MainFrame.cpp
int main()

    Vector3<int> vec(10, 20, 30);

    cout << "Press any key to continue..." << endl;

    return 0;

任何有关找出此问题的帮助将不胜感激。谢谢

【问题讨论】:

你能发布Vector3的完整定义吗? 您需要显示更多代码。您显示的代码似乎没有问题。 你的模板代码和主文件在同一个(包含的)文件中,还是在单独的文件中? 按要求发布了我项目中的所有代码。对此感到抱歉 @vyktor 我有一个名为 MainFrame 的单独文件,它只包含主要功能 【参考方案1】:

模板需要在使用它们的同一编译单元中定义。您不能将模板的实现放在代码中显示的不同文件中。

我还要注意,就目前而言,您不需要析构函数。您没有在其中做任何事情并且它不是虚拟的,因此可以省略它以允许编译器为您生成一个。

【讨论】:

啊...所以只是为了确保,您的意思是每当我使用模板时,声明和实现都需要在同一个文件中?? 是的,或者包含在另一个文件中。我经常将代码内联放在模板类中。我见过一些人把它放在另一个文件中(例如Vector3.tpp),然后#include它从定义模板类的标题中(Vector3.h)。 太棒了!感谢您的帮助:D 这样做的原因是,如果编译器想要编译每个可能的模板定义,我们会得到大量编译的目标文件。只需考虑 template&lt;int N&gt; :编译器将不得不编译 2^32-1 次相同的类,这将花费很长时间并用目标文件填充你的 HD。因此模板不能被预编译成静态库:谁包含它必须编译它。【参考方案2】:

简短回答:您不想在Vector.cpp 中包含Vector 成员函数的定义,应将它们移至Vector.h。长答案是模板不是一个类:它是一个构造类的模板。因此模板的定义必须在包含Vector.h的编译单元(源文件)中可用。

如果您想将事物分开,一个常见的解决方案是制作,例如,VectorImpl.h:

// VectorImpl.h

template<class T>
Vector<T>::Vector(T x, T y, T z)  ... 

并从Vector.h 中包含它,如下所示:

// Vector.h

#ifndef VECTOR_H
#define VECTOR_H

template<class T>
class Vector  ... ;

#include "VectorImpl.h"

#endif

种情况下您想要一个Vector.cpp:特别是,如果您想将Vector 限制为几种类型,您将在Vector.cpp 中使用这些类型显式地实例化Vector

template class Vector<double>;

这允许您创建例如预编译模板库。但是,出于您的目的,您可以坚持使用通常的仅标头解决方案。

【讨论】:

以上是关于C++ 3D 矢量模板的主要内容,如果未能解决你的问题,请参考以下文章

C++ 矢量模板每组件操作

C++ STL 矢量模板如何将其对象存储在 Visual Studio 编译器实现中?

C++晋升之std中vector的实现原理(标准模板动态库中矢量的实现原理)

C++标准模板库(STL)——vector常见用法详解

带有目标相机的 C++ 3d 矢量/矩阵库的建议

c++ 容器含义