<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=446689&amp;view=findpost&amp;p=3905568</guid>
        <pubDate>Mon, 10 Jun 2024 16:06:02 +0000</pubDate>
        <title>Шаблонный конструктор в нешаблонном классе</title>
        <link>https://forum.sources.ru/index.php?showtopic=446689&amp;view=findpost&amp;p=3905568</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=446689&view=findpost&p=3905563'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-06-10T17:45:53+03:00">10.06.24, 14:45</time></span><div class='quote '>Резюме. Третий вариант с реализацией сразу в q.h и без всяких q1.cpp нынче рулит.</div></div><br>
Н-да ... делать нечего, надо принимать &quot;правила игры&quot;  :-?]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=446689&amp;view=findpost&amp;p=3905563</guid>
        <pubDate>Mon, 10 Jun 2024 14:45:53 +0000</pubDate>
        <title>Шаблонный конструктор в нешаблонном классе</title>
        <link>https://forum.sources.ru/index.php?showtopic=446689&amp;view=findpost&amp;p=3905563</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=446689&view=findpost&p=3905550'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2024-06-10T12:42:35+00:00">10.06.24, 12:42</time></span><div class='quote '>Ничего не понял, но очень интересно&#33;</div></div>Чуть подробнее. Например:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// q.h</div><div class="code_line">template &#60;typename T&#62;</div><div class="code_line">T add(const T&amp; a, const T&amp; b);</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// q1.cpp</div><div class="code_line">#include &quot;q.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;typename T&#62;</div><div class="code_line">T add(const T&amp; a, const T&amp; b)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;return a + b;</div><div class="code_line">}</div></ol></div></div></div></div><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// q2.cpp</div><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &quot;q.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">int main()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; add(12, 34) &#60;&#60; std::endl;</div><div class="code_line">}</div></ol></div></div></div></div>Когда компилятор в q2.cpp видит add(12, 34), он вполне способен разрулить объявление в q.h, чекнуть использование и вызвать, но не сгенерировать конкретизацию для T == int, т.к. не видит определения add&lt;&gt;(). Когда компилятор видит это определение в q1.cpp, он вполне способен сгенерировать конкретизацию для T == int, но не в курсе, что должен это сделать, т.к. не видит никакого использования add&lt;&gt;(). В итоге в q2 будет внешняя ссылка, а в q1 не будет конкретизации:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">q2.obj : error LNK2019: ссылка на неразрешенный внешний символ &quot;int __cdecl add&#60;int&#62;(int const &amp;,int const &amp;)&quot; (??$add@H@@YAHABH0@Z) в функции _main.</div><div class="code_line">q1.exe : fatal error LNK1120: неразрешенных внешних элементов: 1</div></ol></div></div></div></div><br>
Решаем через экспорт шаблонов:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// q.h</div><div class="code_line">export template &#60;typename T&#62;</div><div class="code_line">T add(const T&amp; a, const T&amp; b);</div></ol></div></div></div></div>Это должно бы решить проблему, если бы не но:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">D:\Work\delMe\q.h(2): error C3348: экспортированные шаблоны не являются частью текущих стандартов C++</div></ol></div></div></div></div>А всё потому, что:<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>Working Draft, Standard for Programming Language C&#043;&#043;</span><div class='quote '>C.2.7 <span class="tag-color tag-color-named" data-value="blue" style="color: blue">Clause 17</span>: templates [diff.cpp03.temp]<br>
<sup class='tag-sup'>1</sup> <strong class='tag-b'>Affected subclause</strong>: <span class="tag-color tag-color-named" data-value="blue" style="color: blue">17.1</span><br>
<strong class='tag-b'>Change</strong>: Remove <span class="tag-font" data-value="Courier" style="font-family:Courier">export</span>.<br>
<strong class='tag-b'>Rationale</strong>: No implementation consensus.<br>
<strong class='tag-b'>Effect on original feature</strong>: A valid C++ 2003 declaration containing <span class="tag-font" data-value="Courier" style="font-family:Courier">export </span>is ill-formed in this International Standard.</div></div><br>
Ок, решаем через явную конкретизацию:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// q1.cpp</div><div class="code_line">#include &quot;q.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;typename T&#62;</div><div class="code_line">T add(const T&amp; a, const T&amp; b)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;return a + b;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">template</div><div class="code_line">int add&#60;int&#62;(const int&amp;, const int&amp;);</div></ol></div></div></div></div>Явный запрос на генерацию конкретизации для T == int вынуждает компилер это сделать даже притом, что неявных запросов не было. Теперь линкер будет доволен, и оно даже будет работать:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">/out:q1.exe</div><div class="code_line">q1.obj</div><div class="code_line">q2.obj</div><div class="code_line">&nbsp;</div><div class="code_line">D:\Work\delMe&#62;q1</div><div class="code_line">46</div></ol></div></div></div></div>Когда-то так пробовали делать: в спецом предусмотренной для этого единице трансляции хреначили все явные запросы. Только вот задолбались в итоге это делать. К тому же это не полностью решает проблему, т.к. в точке использования контекст может отличаться от контекста в точке инстанцирования. (В общем-то именно это и послужило причиной саботажа экспорта шаблонов. Очень тяжело переносить контексты видимых имён из одной единицы трансляции в другую. Притом, что всякие make тоже задолбаются учитывать зависимости. EDS так прямо и заявила, что мол они-то молодцы, реализовали, только вот заняло это у них полтора человеко-года. К тому же это единственная фича C++, которая требует от компилятора способности работать сразу с несколькими контекстами имён, причём ещё и переключать их на лету.) К примеру чуть более сложная<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">template &#60;typename T&#62;</div><div class="code_line">T add(const T&amp; a, const T&amp; b)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;return f(a) + f(b);</div><div class="code_line">}</div></ol></div></div></div></div>начинает быть зависимой от некой там f(), которая тоже не пойми что, и в разных единицах трансляции может оказаться совсем разными сущностями.<br>
<br>
Резюме. Третий вариант с реализацией сразу в q.h и без всяких q1.cpp нынче рулит.<br>
В отношении твоего вопроса о метакодинге, получается, что второй вариант тебе просто бесполезен, т.к. ты и так видишь, какие конкретизации явно запрашиваешь. Ну и т.к. первый вариант недоступен, то да, остаётся исключительно третий.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=446689&amp;view=findpost&amp;p=3905550</guid>
        <pubDate>Mon, 10 Jun 2024 12:42:35 +0000</pubDate>
        <title>Шаблонный конструктор в нешаблонном классе</title>
        <link>https://forum.sources.ru/index.php?showtopic=446689&amp;view=findpost&amp;p=3905550</link>
        <description><![CDATA[Majestio: Ничего не понял, но очень интересно&#33; :lol: Как-то в юности один из моих преподов прямо вбил мне в мозг фразу &quot;Не учи меня жить - помоги материально&#33;&quot;. Конечно всё в переносном смысле, а если в прямом &quot;Хватит объяснений - скажи чего делать-та&#33;&quot;. <strong class='tag-b'>Qraizer</strong>, собственно и у меня вопрос - реализовывать тела шаблонных конструкторов и методов прямо в заголовочном файле - это единственный выход, или где? :-? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-06-10T12:44:32+00:00">10.06.24, 12:44</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=446689&view=findpost&p=3905476'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Dushevny &#064; <time class="tag-quote__quoted-time" datetime="2024-06-10T05:50:37+00:00">10.06.24, 05:50</time></span><div class='quote '>Поскольку вы унесли его в другой .cpp - компилятор его не видит и понятия не имеет, как именно ему инстанцировать шаблон.</div></div><br>
И, кстати да, утверждение не совсем верное - не компилятор ругается, а линкер. К тому времени компилятор уже давно и умело покинул оперативную память. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-06-10T12:49:05+00:00">10.06.24, 12:49</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=446689&view=findpost&p=3905476'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Dushevny &#064; <time class="tag-quote__quoted-time" datetime="2024-06-10T05:50:37+00:00">10.06.24, 05:50</time></span><div class='quote '>Определение шаблона должно быть видно компилятору в момент инстанцирования. Поскольку вы унесли его в другой .cpp - компилятор его не видит и понятия не имеет, как именно ему инстанцировать шаблон. Оставьте реализацию в заголовочном файле. Если сомневаетесь - посмотрите любой системный заголовочный файл.<br>
<br>
Добавлено: в .cpp можно (нужно) уносить полную специализацию шаблона. Т.е. если для AnyDigit&lt;uint8_t&gt; у вас будет какая-то особая реализация конструктора - в заголовочном вы пишете</div></div><br>
Вот тут и засада. Я и без шаблонов могу нагенерить 100500 конструкторов с помощью нехитрого скрипта на ... Perl&#39;овке&#33;  Как два байта об асфальт :lool: Но смысл тогда в метапрограммировании (конкретно в моем случае)?&#33;&#33;]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=446689&amp;view=findpost&amp;p=3905548</guid>
        <pubDate>Mon, 10 Jun 2024 12:33:40 +0000</pubDate>
        <title>Шаблонный конструктор в нешаблонном классе</title>
        <link>https://forum.sources.ru/index.php?showtopic=446689&amp;view=findpost&amp;p=3905548</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=446689&view=findpost&p=3905476'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Dushevny &#064; <time class="tag-quote__quoted-time" datetime="2024-06-10T05:50:37+00:00">10.06.24, 05:50</time></span><div class='quote '>Определение шаблона должно быть видно компилятору в момент инстанцирования. Поскольку вы унесли его в другой .cpp - компилятор его не видит и понятия не имеет, как именно ему инстанцировать шаблон.</div></div>Не совсем так. Компилятор не конкретизирует шаблон, если не будет видеть его определения, но это не значит, что программа неверна. Как и в случае обычных функций, компилятору достаточно объявления, чтобы проверить корректность использования, при необходимости скастить параметры, сгенерировать код вызова и понять, что и как делать с результатом.<br>
Проблема в том, что компилятор – как и в случае обычных функций – полагает, что где-то это определение есть, и если оно есть, то ок. Только вот с шаблонами часто получается так, что его нет. Когда где-то там, компилятор встретит определение шаблона, он понятия не имеет, где и с какими наборами параметров он был использован. Получается, что в точке использования нет определения, поэтому компилер не в состоянии сгенерирвоать конкретизацию и вставляет просто вызов инстанцированного шаблона, а в точке, где доступно определение, обычно нет использования с теми же наборами параметров, поэтому компилер этой конкретизации не сгенерировал. В итоге линкер ругается на отсутствующий символ.<br>
Проблема решатся тремя путями. Самый правильный – экспорт шаблонов. Увы, но ленивые разработчики реализаций по всему миру саботировали эту фичу, и единственные, кто её в своё время реализовал ≈20 лет назад – это EDS, известная своими front-end решениями для других. Например, Intel C++ Compiler юзает именно их. Правда, экспорт шаблонов они лицензировали у них только под линух. Из-за ленности разработчиков Комитет в C++11 объявил экспорт шаблонов опциональной фичей. Второй по популярности – явные инстанцирования. Там, где доступно определение, можно нафигачить явных запросов на инстанцирование, с теми же наборами параметров, с каковыми шаблон используется где-то там. В итоге компилятор нагенерит инстанцирований без неявных запросов, и у линкера всё срастётся. Ну и третий самый дешёвый для нас, но не компилятора, каковой практически повсеместно и используется – предоставлять компилятору определение всегда, чтобы он мог генерировать конкретизации везде, где они неявно запрашиваются, а проблемы с дубликатами, каковых в итоге по всей программе может оказаться неимоверное количество, становятся проблемами компилятора и линкера, которые они обязаны решить самостоятельно.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=446689&amp;view=findpost&amp;p=3905477</guid>
        <pubDate>Mon, 10 Jun 2024 05:53:21 +0000</pubDate>
        <title>Шаблонный конструктор в нешаблонном классе</title>
        <link>https://forum.sources.ru/index.php?showtopic=446689&amp;view=findpost&amp;p=3905477</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=446689&view=findpost&p=3905476'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Dushevny &#064; <time class="tag-quote__quoted-time" datetime="2024-06-10T05:50:37+00:00">10.06.24, 05:50</time></span><div class='quote '>Определение шаблона должно быть видно компилятору в момент инстанцирования. Поскольку вы унесли его в другой .cpp - компилятор его не видит и понятия не имеет, как именно ему инстанцировать шаблон. Оставьте реализацию в заголовочном файле. Если сомневаетесь - посмотрите любой системный заголовочный файл.</div></div><br>
Спасибо&#33; Да нет, уже не сомневаюсь. Догадывался об этом, но думал, что я где-то в чём-то ошибаюсь, упускаю и есть более другие решения.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=446689&amp;view=findpost&amp;p=3905476</guid>
        <pubDate>Mon, 10 Jun 2024 05:50:37 +0000</pubDate>
        <title>Шаблонный конструктор в нешаблонном классе</title>
        <link>https://forum.sources.ru/index.php?showtopic=446689&amp;view=findpost&amp;p=3905476</link>
        <description><![CDATA[Dushevny: Определение шаблона должно быть видно компилятору в момент инстанцирования. Поскольку вы унесли его в другой .cpp - компилятор его не видит и понятия не имеет, как именно ему инстанцировать шаблон. Оставьте реализацию в заголовочном файле. Если сомневаетесь - посмотрите любой системный заголовочный файл.<br>
<br>
Добавлено: в .cpp можно (нужно) уносить полную специализацию шаблона. Т.е. если для AnyDigit&lt;uint8_t&gt; у вас будет какая-то особая реализация конструктора - в заголовочном вы пишете <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">template&#60;&#62; AnyDigit&#60;uint8_t&#62;(const uint8_t value);</div></ol></div></div></div></div> а в .cpp уносите<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">template&#60;&#62; AnyDigit&#60;uint8_t&#62;(const uint8_t value)</div><div class="code_line">: _value(value)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout&#60;&#60;&quot;Слава мне, победителю драконов!&quot;;</div><div class="code_line">}</div></ol></div></div></div></div>]]></description>
        <author>Dushevny</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=446689&amp;view=findpost&amp;p=3905475</guid>
        <pubDate>Mon, 10 Jun 2024 01:08:37 +0000</pubDate>
        <title>Шаблонный конструктор в нешаблонном классе</title>
        <link>https://forum.sources.ru/index.php?showtopic=446689&amp;view=findpost&amp;p=3905475</link>
        <description><![CDATA[Majestio: Всем привет&#33;<br>
<br>
Решил я немного пометапрограммировать, вернее попытаться ... но произошел горкий катаклизьм&#33;  :lol: <br>
<br>
Суть в следующем. Делаю тестовую программу <span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue">main.cpp</span></span>:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &quot;anydigit.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">using namespace std;</div><div class="code_line">&nbsp;</div><div class="code_line">int main() {</div><div class="code_line">&nbsp;&nbsp;AnyDigit any(3.14);</div><div class="code_line">&nbsp;&nbsp;cout &#60;&#60; &quot;Any: &quot; &#60;&#60; any &#60;&#60; endl;</div><div class="code_line">&nbsp;&nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><br>
А в <span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue">anydigit.h</span></span> пишу следующее:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#ifndef ANYDIGIT_H</div><div class="code_line">#define ANYDIGIT_H</div><div class="code_line">&nbsp;</div><div class="code_line">#include &#60;ostream&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">class AnyDigit {</div><div class="code_line">&nbsp;&nbsp; &nbsp;double _value;</div><div class="code_line">&nbsp;&nbsp;public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;AnyDigit(): AnyDigit(0.0) {};</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;template&#60;typename T&#62; AnyDigit(const T value) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;static_assert(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;(std::is_integral_v&#60;T&#62; || std::is_floating_point&#60;T&#62;::value),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&quot;Желаю аргумент в виде целого или числа с плавающей!&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_value = value;</div><div class="code_line">&nbsp;&nbsp; &nbsp;};</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;friend std::ostream&amp; operator&#60;&#60;(std::ostream&amp; os, const AnyDigit&amp; obj) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;os &#60;&#60; std::scientific &#60;&#60; obj._value;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return os;</div><div class="code_line">&nbsp;&nbsp; &nbsp;};</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">#endif &nbsp;// ANYDIGIT_H</div></ol></div></div></div></div><br>
И все собирается, и запускается, и работает. Но как только я хочу в заголовочном файле оставить только объявление:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">template&#60;typename T&#62; AnyDigit(const T value);</div></ol></div></div></div></div><br>
А реализацию перенести в <span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue">.cpp</span></span> файл:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &quot;anydigit.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">template&#60;typename T&#62; AnyDigit::AnyDigit(const T value) {</div><div class="code_line">&nbsp;&nbsp;static_assert(</div><div class="code_line">&nbsp;&nbsp; &nbsp;(std::is_integral_v&#60;T&#62; || std::is_floating_point&#60;T&#62;::value),</div><div class="code_line">&nbsp;&nbsp; &nbsp;&quot;Желаю аргумент в виде целого или числа с плавающей!&quot;</div><div class="code_line">&nbsp;&nbsp;);</div><div class="code_line">&nbsp;&nbsp;_value = value;</div><div class="code_line">}</div></ol></div></div></div></div><br>
То сборка происходит с ошибкой:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">ld.lld: error: undefined symbol: AnyDigit::AnyDigit&#60;double&#62;(double)</div><div class="code_line">&#62;&#62;&#62; referenced by ..\../main.cpp:7</div><div class="code_line">&#62;&#62;&#62; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; debug/main.o:(_main)</div><div class="code_line">clang++: error: linker command failed with exit code 1 (use -v to see invocation)</div><div class="code_line">mingw32-make[1]: *** [Makefile.Debug:71: debug/AnyDigit.exe] Error 1</div></ol></div></div></div></div><br>
Ну и, собственно, вопрос: что я делаю не так, и как это сделать правильно? Я имею ввиду разнесение кода на объявление и реализацию в разные файлы при реализации шаблонного конструктора (возможно и методов - в будущем).]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	