Ошибка компоновщика MSVC LNK2001, неразрешенная внешняя для метода шаблона, определенного в файле cpp - PullRequest
0 голосов
/ 21 января 2012

Я немного новичок в C ++ (обычно я работаю в C #, но сейчас я работаю над несколько кроссплатформенным проектом), поэтому я не совсем привык ко всем его концепциям и как именно компилировать /связывание работает.Поэтому, естественно, я не совсем уверен, почему я получаю эту ошибку.Я немного исследовал ошибку, и кажется, что люди обычно сталкиваются с проблемой, когда они не связывают библиотеку или не объявляют функцию в заголовочном файле, но никогда не определяют ее вне этого.Моя ошибка, как ни странно, тоже не является результатом.Точный текст ошибки таков:

"Error 1 error LNK2001: unresolved external symbol "public: __thiscall ld22::QuadNode<class ld22::DrawableObject>::QuadNode<class ld22::DrawableObject>(class sf::Rect<float>)" (??0?$QuadNode@VDrawableObject@ld22@@@ld22@@QAE@V?$Rect@M@sf@@@Z) C:\Users\Nick\Documents\Visual Studio 2010\Projects\GDCSFMLTest\GDCSFMLTest\main.obj"

Мне кажется, что он пытается сказать мне, что я никогда не делал реализацию файла.Тем не менее, у меня есть.main.cpp, файл, который компилируется в main.obj и выдает ошибку, включает в себя Quadtree.h, который объявляет функцию (технически конструктор) со строкой QuadNode(sf::FloatRect);, а в файл Quadtree.cpp я включаю Quadtree.hи определите конструктор следующим образом:

template<class T>
ld22::QuadNode<T>::QuadNode(sf::FloatRect bounds)
{
    Bounds = bounds;
}

Прошу прощения за любые плохие практики кодирования и так далее, как я уже сказал, я довольно новичок в C ++ и все еще пытаюсь разобраться.Любая помощь приветствуется (особенно если я где-то допустил глупую ошибку или ошибку новичка, что, я думаю, я сделал), и если вам нужна дополнительная информация, я был бы рад предоставить ее.

1 Ответ

3 голосов
/ 21 января 2012

В C ++ шаблонные классы должны быть определены в заголовочных файлах. Это связано с тем, что в отличие от обобщений в C #, где они отслеживают тип <T> во время выполнения, новый класс фактически генерируется компилятором для каждого <T>, с которым вы его используете. Компилятор не может на самом деле скомпилировать шаблонную форму класса, а затем связать информацию о типе. На мой взгляд, шаблоны в C ++ - это действительно форма преобразования исходного кода, которая происходит до стадии компиляции.

См. Этот вопрос для получения дополнительной информации о том, почему:

...