Разделение реализации и объявления, шаблоны, VC++
2754
7
Как такое сотворить? Если запихнуть и объявление, и реализацию в заголовочный файл (скажем, template.h), всё отлично работает. Стоит объявление засунуть, скажем, в template.h, а реализацию в template.cpp, компилятор начинает ругаться про error LNK2019: unresolved external symbol. Если классы не шаблонные, такое разделение никаких вопросов у VC++ не вызывает. В принципе, работает когда всё в одном файле, да и хрен с ним... Но во всех книжках по C++ долго пишется о необходимости разделения объявления и реализации... Только чтобы код к этим самым книжкам (скачанный с сайта издательства, то есть мои глюки исключены) компилировался, тоже приходится дописывать содержимое .cpp-файлов в конец .h- файлов... Что я не так делаю?
Без взгляда на код не разобраться. Там #include стоит?
Anomander
Код -- какой угодно, лишь бы встречался хотя бы один шаблон.
Ну, к примеру, такой:
//dumbClass.h
template
class dumbClass
{
private:
T item;
public:
void assignValue(T val);
};

//dumbClass.cpp
#include "dumbClass.h"

template
void dumbClass::assignValue(T val)
{
item = val;
}


//templatez.cpp
#include "dumbClass.h"

int _tmain(int argc, _TCHAR* argv[])
{
dumbClass k;
k.assignValue(10);
return 0;
}

Всякие дополнительные вещи, без которых это дело работать не будет (в зависимости от компилятора, типа "stdafx.h" для VS .Net), включались.
Если dumbClass.cpp дописать в конец dumbClass.h, то всё работает. Если оставить как есть -- ошибка. Само собой, оба файла (и .h и .cpp) в проект включены. Я тут с гуглом посоветовался, там умные люди тоже говорят о необходимости сшивать объявление и реализацию в один .h-файл... Понятно, что так оно работает, а по-другому не работает. Но почему?? И как тогда без этого обходятся товарищи, пишущие книжки по C++?
Что я не так делаю?
И объявления, и реализация шаблонов ДОЛЖНЫ находится в .h файле.

Поскольку в .cpp по определению должно быть то, что генерирует код. Шаблон же по своей сути не генерирует никакого кода, пока ты не создаешь класс, на основе этого шаблона.
CoolUser
Согласен... Но вот только, читаешь, например, товарища R. Lafore, Object-Oriented Programming in C++, или Дейтелов C++ How To Program... И везде идет отделение интерфейса от реализации. Но код, скачанный с их сайтов, нихрена не работает пока его в один файл не запихаешь... Как-то ведь мужики книжки писали... :а\?:
CoolUser
Угу. Приходится всё, что написано в .cpp-файлах дописывать в .h-файлы, после этого проблема исчезает. Если шаблонов нет, никаких изменений не требуется. Правда, у Лафоре есть какая-то самодельная библиотека для консольной псевдографики, там шаблонов не видно, но глюк тот же самый.
Вот здесь (по английски) кратко, но доходчиво описана эта проблема:
http://sowell.ecs.fullerton.edu/cs331/TemplateClasses.html