Добрый день!
Есть класс Counter:
Counter.h:
#pragma once
#include <list>
#include <string>
template<class T> class Counter
{
public:
Counter(void);
};
Counter.cpp:
#include "Counter.h"
template<class T> Counter<T>::Counter()
{
}
Его использование:
#include <string>
#include "Counter.h"
//Test - класс для теста
void Test::Count()
{
std::string str = "qwe";
Counter<std::string> counter;
}
При компиляции всё нормально, но линковщик выдает ошибку:
error LNK2019: unresolved external symbol "public: __thiscall Counter<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >::Counter<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >(void)" (??0?$Counter@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@@QAE@XZ) referenced in function "public: static void __cdecl Test::Count(void)" (?Count@Test@@SAXXZ)
Никак не могу понять — в чём дело?!
Подскажите, пожалуйста!!!
Поместите реализацию конструктора в заголовочный файл. Шаблон, в данном случае, ведет себя как макрос. Для того, чтобы его использовать (инстанцировать), необходимо иметь под рукой его определение (а Вы его спрятали в cpp файл). Вот прямая аналогия — Вам же не приходит в голову отделять объявление макроса от его определения? Думаю, что нет. Вот так же и здесь.
Здравствуйте, Анатолий Широков, Вы писали:
АШ>Для того, чтобы его использовать (инстанцировать), необходимо иметь под рукой его определение (а Вы его спрятали в cpp файл).
Можно попробывать воспользоваться
export — ом
Правда это может только
http://www.comeaucomputing.com/... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
N>Можно попробывать воспользоваться export — ом Правда это может только http://www.comeaucomputing.com/<br />
<span class='lineQuote level1'>N></span>
А можно и не пробовать, ибо в понимании концепции шаблонов это нисколько не поможет.
Доколе этот вопрос будет задаваться каждую неделю? Куда смотрят разработчики FAQ?