Если проблема заключается в дополнительном времени компиляции и раздувании бинарного размера, полученном путем компиляции .h как части всех используемых им .cpp-модулей, во многих случаях то, что вы можете сделать, - это сделать класс шаблона опустившимся из не-шаблонного базовый класс для не зависящих от типа частей интерфейса, и что базовый класс может иметь свою реализацию в файле .cpp.
HTTP::HTTP(const string& adress)
{
Poco::URI uri(
adress.substr(0, 4) == "http" ? adress : "http://" + adress
);
HTTPClientSession session{ uri.getHost(), uri.getPort() };
}
Последняя строка в этом конструкторе создает локальную переменную с именем session
, ... которая немедленно уничтожается при возвращении конструктора и не имеет ничего общего с членом класса того же члена.
Итак, когда все сказано и сделано, член session
этого экземпляра класса остается неинициализированным. Для сравнения:
session = HTTPClientSession{ uri.getHost(), uri.getPort() };
Вместо этого правильно будет инициализироваться член класса, как было указано в вашем очевидном намерении. Однако, поскольку HTTPClientSession не имеет пригодного для использования оператора присваивания, ваша единственная возможность - либо продолжать использовать unique_ptr
, либо реструктурировать конструктор так, чтобы он создавал член класса в своем списке инициализатора.