Проблема с шаблоном класса

программирование C++ шаблоны

Есть некий шаблон класса:
//test.h
template<class any>
class test
{
public:
void foo(any);
//...
};

//test.cpp
#inlcude "test.h"
template<class any>
test<any>::foo(any item)
{
//...
}

Далее (в ф-ии main) идет обращение к методу:
test<int> t;
t.foo(2);

Выдаются 2 ошибки компоновщика:
"Error 1 error LNK2019: unresolved external symbol "public: void __thiscall test<int>::foo(int)" (?foo@?$test@H@@QAEXH@Z) referenced in function _wmain"

"Error 2 fatal error LNK1120: 1 unresolved externals"

Помогите разобраться. Информацию в MSDN по данной ошибке читал...


Примечание:
VS 2008

Примечание:
katzyn, перенес - все тоже самое

Примечание:
Ах... у меня оказывается еще один подобный метод в cpp файле реализован... нукась :)

Примечание:
Так... перенес реализацию подобных методов в хедер... вроде бы работает.
Эх, гемор :). И некрасиво это как-то держать реализацию в хедэре :)

Примечание:
Это единственное решение проблемы. Только так и не иначе?

Примечание:
template<class any>
test<any>::foo(any item)
это я опечатался :)
там
template<class any>
void test<any>::foo(any item)

Примечание:
Да и я вообще сначала подумал, что я может когда с конфигурацией компоновщика намудрил... Однако пробовал компилить в билдере, dev-c++ и там все тоже самое. Видимо дейстивтельно реализацию методов шаблона класса нужно писать в одном модуле...

Примечание:
Black, спасибо, жди письма :)

Примечание:
Странно... у меня было сделано все точно также, как и у Вас
попробую поковырять (хотя перенос реализаций в хедер решило проблему... но надо все равно разобраться до конца).

Примечание:
Заметил, что у Вас в проекте в настройках компоновщика во вкладке "advanced" пара настроек изменены... я поставил у себя такие же - не помогло.
Проект смотрел-пересматривал по 10 раз... даже и не знаю, к чему придраться :). Завтра попробую собрать заного.
Ответы:
Перенеси реализацию метода foo в заголовочный файл.
Просто для каждого возможного аргумента шаблона нужно генерировать отдельный программный код. Поэтому при компиляции какого-либо модуля, использующего такой класс или функцию, нужна её реализация, чтобы сгенерировать этот самый код. А у тебя реализация где-то в отдельном модуле валяется, и при компиляции основного модуля она недоступна. В результате код этот не генерируется и линковщик его не находит. Так что пихай реализацию таких методов прямо в заголовочный файл.
//test.h
template<class any>
class test
{
public:
void foo(any) {
}
//...
};
// основной_модуль.cpp
int main() {
 test<int> t;
 t.foo(2);
 return 0;
}
а с template'ами только в хеадере реализацию по-хорошему и приходится держать
Должно всё работать и с файлами реализации(.срр)
Я недавно делал калькулятор,использовал шаблонный класс стек.Описание и реализация разнесены по разным файлам.Всё прекрасно работает.
В main то же должна быть строка
Иногда бывает так,что собрал проэкт,потом сделал неверно #include и дальше пропадает подсветка синтаксиса,не видно классов,даже если всё вернул назад.Или Rebuild Solution или  создать заново проэкт,всё переписать  и внимательно просмотреть все инклуды.
На самом деле, если в исходнике, где содержится РЕАЛИЗАЦИЯ шаблонной функции/класса имеется также её ИСПОЛЬЗОВАНИЕ с ТЕМ ЖЕ ПАРАМЕТРОМ-ТИПОМ, то всё скомпилируется. Причём если это шаблонный класс, то надо, чтобы в том исходнике присутствовало не просто его использование С ТЕМ ЖЕ ПАРАМЕТРОМ-ТИПОМ, а вызов ВСЕХ нужных в других местах методов. Если в другом месте мы попытаемся вызвать неиспользованный там метод, или класс или его метод с другим параметром-типом, то не скомпилируется. В общем случае, чтобы обеспечить возможность использования своего заголовочного файла с любым параметром-типом, надо чтобы в нём была реализация, а не в отдельном исходном файле.
Универсального же решения, чтобы можно было использовать шаблон с любым типом, кроме как включить реализацию в заголовочный файл в C++ нет и быть не может.
katzyn


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.