C ++ 3D векторный шаблон - PullRequest
       4

C ++ 3D векторный шаблон

2 голосов
/ 17 января 2012

Я пытаюсь создать класс Vector, используя шаблоны для хранения трехмерных положений объекта.Я создал класс, но получаю сообщение об ошибке LNK2019: неразрешенный внешний символ «public: __thiscall Vector3 :: ~ Vector3 (void)» (?? 1? $ Vector3 @ H @@ QAE @ XZ), указанный в функции _main

Это как-то связано с тем, что я создаю Вектор в главной функции, но я не могу понять, что с ним не так ... Вот мой код:

//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;
}

ЛюбойПомощь в обнаружении этой проблемы будет принята с благодарностью.Спасибо

Ответы [ 2 ]

7 голосов
/ 17 января 2012

Шаблоны должны быть определены в том же модуле компиляции, в котором они используются.Вы не можете поместить реализацию шаблона в другой файл, как показано в коде.

Я также отмечу, что в нынешнем виде вам не нужен деструктор.Вы ничего в этом не делаете, и это не виртуально, поэтому его можно пропустить, чтобы компилятор мог сгенерировать его для вас.

2 голосов
/ 17 января 2012

Краткий ответ: вы не хотите включать определения ваших Vector функций-членов в Vector.cpp и должны переместить их в 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

Там есть обстоятельства, при которых вы хотели бы хотеть иметьa Vector.cpp: в частности, если вы хотите ограничить Vector только несколькими типами, вы можете создать экземпляр Vector с этими типами явно в Vector.cpp:

template class Vector<double>;

Это позволяет вамсоздавать, например, библиотеки предварительно скомпилированных шаблонов.Однако для ваших целей вы можете просто придерживаться обычного решения только для заголовков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...