[英]C++ 3D Vector Template
我正在嘗試使用模板創建一個Vector類來存儲對象的3D位置。 我創建了這個類,但是我一直收到錯誤LNK2019:函數_main中引用的未解析的外部符號“public:__thiscall Vector3 :: ~Vector3(void)”(?? 1?$ Vector3 @ H @@ QAE @ XZ)
這與我在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;
}
任何有關發現此問題的幫助將不勝感激。 謝謝
模板需要在使用它們的同一編譯單元中定義。 您不能像在代碼中顯示的那樣將模板的實現放在不同的文件中。
我還要注意,現在看來,你不需要析構函數。 您沒有在其中執行任何操作並且它不是虛擬的,因此可以省略它以允許編譯器為您生成一個。
簡短回答:您不希望在Vector.cpp
包含Vector
成員函數的定義,並應將它們移動到Vector.h
。 長的答案是模板不是類:它是構造類的模板 。 因此,模板的定義必須在包含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>;
這允許您創建例如預編譯模板庫。 但是,出於您的目的,您可以堅持使用通常的僅限標頭的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.