LINUX.ORG.RU

История изменений

Исправление firkax, (текущая версия) :

Когда ты компилировал stream.cpp, компилятор не знал, что тебе понадобится Stream<int> и поэтому не сделал для него методы. Выяснилось это только при линковке. Библиотека тут ни при чём, ты мог всё в приложении компилировать, результат был бы тот же. Поэтому шаблоны надо либо целиком в .h делать, либо в .cpp файле (в том, где методы для шаблона расположены) заранее указывать для каких типов ты будешь его использовать (explicit instantiation о котором писали выше).

Дописываешь в конец stream.cpp строчку

template class Stream<int>;

и тогда в stream.o и в библиотеке будут методы для Stream<int>.

Минусы способа «шаблон целиком в .h» - компилятор будет его заново компилировать каждый раз, когда ты его куда-то инклюдишь, что плохо скажется на времени компиляции (ну как и происходит обычно).

Минусы способа «explicit instantiation» - тебе надо заранее знать, какие варианты шаблона будут нужны, и вручную поддерживать этот список в соответствующем .cpp файле. Понятное дело, распространять такую библиотеку в скомпилированном виде для использования в других проектах будет почти бесполезно. Впрочем, .h тоже в скомпилированном виде не распространишь.

Исправление firkax, :

Когда ты компилировал stream.cpp, компилятор не знал, что тебе понадобится Stream<int> и поэтому не сделал для него методы. Выяснилось это только при линковке. Библиотека тут ни при чём, ты мог всё в приложении компилировать, результат был бы тот же. Поэтому шаблоны надо либо целиком в .h делать, либо в .cpp файле (в том, где методы для шаблона расположены) заранее указывать для каких типов ты будешь его использовать (explicit instantiation о котором писали выше).

Дописываешь в конец stream.cpp строчку

template class Stream<int>;

и тогда в stream.o и в библиотеке будут методы для Stream<int>.

Исходная версия firkax, :

Когда ты компилировал stream.cpp, компилятор не знал, что тебе понадобится Stream<int> и поэтому не сделал для него методы. Выяснилось это только при линковке. Библиотека тут ни при чём, ты мог всё в приложении компилировать, результат был бы тот же. Поэтому шаблоны надо либо целиком в .h делать, либо в .cpp файле (в том, где методы для шаблона расположены) заранее указывать для каких типов ты будешь его использовать (explicit instantiation о котором писали выше).