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<int N>
:编译器将不得不编译 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++ STL 矢量模板如何将其对象存储在 Visual Studio 编译器实现中?