簡體   English   中英

C ++ 3D矢量模板

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM