Не удается связать класс с шаблонами с использованием Visual C ++ - PullRequest
1 голос
/ 17 декабря 2010

Я написал небольшой класс массива в C ++, который использует void* для сохранения своих записей.

Теперь я хочу, чтобы он использовал шаблоны. Это мой новый заголовок:

template <typename T>
class SimpleArray
{
public:
    SimpleArray();
    ~SimpleArray();

    void SetEntry(int idx, T setEntry);
    T GetEntry(int idx);
    // and so on
protected:
    T *pData
    short iNumEntries;
}

Функции реализованы в другом файле, например:

#include "SimpleArray.h"

template <typename T>
void SimpleArray<T>::SetEntry(int idx, T setEntry)
{
    // code here
}

template <typename T>
T SimpleArray<T>::GetEntry(int idx)
{
    // more code here
}

Это прекрасно компилируется, но когда я хочу использовать его в каком-то другом коде, подобном этому

SimpleArray<SomeType*> cache;
cache.SetEntry(0, someThing);

Я получаю ошибку компоновщика о том, что существует unresolved external symbol

2> Thing.obj: ошибка LNK2019: неразрешенный внешний символ "public: bool __thiscall SimpleArray :: SetEntry (int, class someThing *)" (? SetEntry @? $ SimpleArray @ PAUsHandle @@@@ QAE_NHPAUsHandle @@@ Z ) упоминается в функции "public: void __thiscall Thing :: Function (int)" (? DelEntry @ Thing @@ QAEXH @ Z) * ​​1017 *

Чувак, я ненавижу, что компоновщик даже не пытается сказать ничего понятного.
В любом случае, настоящая проблема в том, что я сделал что-то не так, чтобы расстроить компоновщик.

Не могли бы вы сказать мне, что я сделал не так?

Ответы [ 2 ]

7 голосов
/ 17 декабря 2010

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

3 голосов
/ 17 декабря 2010

Поместите шаблон в шапку. Вы не можете отделить определения шаблонов C ++ от их экземпляров.

...