Сообщение Re[3]: Вопрос знатокам от 03.04.2023 20:43
Изменено 03.04.2023 20:49 rg45
Re[3]: Вопрос знатокам
Здравствуйте, kov_serg, Вы писали:
_>
_>
_>Зато в таком случае компилируется, но не может слинковать — нет реализации:
Я больше скажу: если ты вынесешь специализацию в отдельный cpp-файл и не будешь подключать в этот файл никаких больше заголовков, вот так:
этим самым ты лишишь компилятор возможности продиагностировать нарушение требований и программа может даже успешно скомпилироваться. Вполне возможно, что и линкер успешно отработает и программу можно будет запустить на выполнение (я проверил на msvc — именно так все и работает). Но все равно программа при этом будет ill-formed.
_>
_>// 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, Вы писали:
_>
_>
_>Зато в таком случае компилируется, но не может слинковать — нет реализации:
Я больше скажу: если ты вынесешь специализацию в отдельный cpp-файл и не будешь подключать в этот файл никаких больше заголовков, вот так:
этим самым ты лишишь компилятор возможности продиагностировать нарушение требований и программа может даже успешно скомпилироваться. Вполне возможно, что и линкер успешно отработает и программу можно будет запустить на выполнение (я проверил на msvc — именно так все и работает). Но все равно программа при этом будет ill-formed.
_>
_>// 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.