Информация об изменениях

Сообщение Re[3]: Вопрос знатокам от 03.04.2023 20:43

Изменено 03.04.2023 20:49 rg45

Re[3]: Вопрос знатокам
Здравствуйте, kov_serg, Вы писали:

_>
_>// header.h
_>template<class T> void f(T);

_>//template<> void f(int);

_>inline void fi(int x) { f(x); }
_>

_>
_>#include "header.h"

_>// template<> void f(int x) {}
_>

_>Зато в таком случае компилируется, но не может слинковать — нет реализации:


Я больше скажу: если ты вынесешь специализацию в отдельный cpp-файл и не будешь подключать в этот файл никаких больше заголовков, вот так:

template<class T> void f(T);

template<> void f(int x) {}


этим самым ты лишишь компилятор возможности продиагностировать нарушение требований и программа может даже успешно скомпилироваться. Вполне возможно, что и линкер успешно отработает и программу можно будет запустить на выполнение (я проверил на msvc — именно так все и работает). Но все равно программа при этом будет ill-formed.
Re[3]: Вопрос знатокам
Здравствуйте, kov_serg, Вы писали:

_>
_>// header.h
_>template<class T> void f(T);

_>//template<> void f(int);

_>inline void fi(int x) { f(x); }
_>

_>
_>#include "header.h"

_>// template<> void f(int x) {}
_>

_>Зато в таком случае компилируется, но не может слинковать — нет реализации:


Я больше скажу: если ты вынесешь специализацию в отдельный cpp-файл и не будешь подключать в этот файл никаких больше заголовков, вот так:

template<class T> void f(T); // повторное объявление вместо подключения заголовка

template<> void f(int x) {}


этим самым ты лишишь компилятор возможности продиагностировать нарушение требований и программа может даже успешно скомпилироваться. Вполне возможно, что и линкер успешно отработает и программу можно будет запустить на выполнение (я проверил на msvc — именно так все и работает). Но все равно программа при этом будет ill-formed.