LINUX.ORG.RU

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

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

у тебя класс Stream «int» нигде не инстанцируется целиком.

#include "lib.h"
#include "stream.h"

Lib::Lib() {}

void Lib::test()
{
    Stream<int> s;
    s.test();
}

тут не инстанцируется, поскольку в хидере шаблона нет тел методов, а только декларации. инстанциацию делает компилятор, видя код тел методов шаблона класса. если он тела не видит, а только заголовки, как у тебя - ему кажется, что шаблон инстанцируется как-то иначе. потому либо ты должен шаблон инстанцировать ручками в stream.cpp, либо вытащить тела методов шаблона в stream.h

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

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

у тебя класс Stream «int» нигде не инстанцируется целиком.

#include "lib.h"
#include "stream.h"

Lib::Lib() {}

void Lib::test()
{
    Stream<int> s;
    s.test();
}

тут не инстанцируется, поскольку в хидере шаблона нет тел методов, а только декларации. инстанциацию делает компилятор, видя код тел методов класса. если он тела не видит, а только заголовки, как у тебя - ему кажется, что класс инстанцируется как-то иначе. потому либо ты должен класс инстанцировать ручками в stream.cpp, либо вытащить тела методов шаблона в stream.h

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