<?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=134045&amp;view=findpost&amp;p=2610264</guid>
        <pubDate>Wed, 02 Jun 2010 02:30:12 +0000</pubDate>
        <title>Шаблоны: unresolved external symbol</title>
        <link>https://forum.sources.ru/index.php?showtopic=134045&amp;view=findpost&amp;p=2610264</link>
        <description><![CDATA[Qraizer: <strong class='tag-b'>B.V.</strong>, ну я не в том смысле, мол, хватай и пользуй. Я в том, что всё-таки есть такие. Хотя юы один.]]></description>
        <author>Qraizer</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134045&amp;view=findpost&amp;p=2609358</guid>
        <pubDate>Mon, 31 May 2010 19:50:02 +0000</pubDate>
        <title>Шаблоны: unresolved external symbol</title>
        <link>https://forum.sources.ru/index.php?showtopic=134045&amp;view=findpost&amp;p=2609358</link>
        <description><![CDATA[B.V.: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=134045&view=findpost&p=2608043'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2010-05-30T01:50:58+00:00">30.05.10, 01:50</time></span><div class='quote '>B.V., кажись, 8-ая фаза с её 3-им способом в действии.</div></div><br>
Компилить на левом компиляторе только ради этой штуки -- да ну. Остановился на явных инстанцированиях. Не так изящно и универсально, но проще, чем переходить на Sun&#39;овский или Intel&#39;овский компиль]]></description>
        <author>B.V.</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134045&amp;view=findpost&amp;p=2608214</guid>
        <pubDate>Sun, 30 May 2010 10:59:24 +0000</pubDate>
        <title>Шаблоны: unresolved external symbol</title>
        <link>https://forum.sources.ru/index.php?showtopic=134045&amp;view=findpost&amp;p=2608214</link>
        <description><![CDATA[antigen: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=134045&view=findpost&p=2608043'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2010-05-30T01:50:58+00:00">30.05.10, 01:50</time></span><div class='quote '>определение шаблона - в одном файле, использование - в другом</div></div><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">/* file.h:*/</div><div class="code_line">template &#60;class T&#62; T func (T);</div><div class="code_line">/* end of file.h */</div><div class="code_line">&nbsp;</div><div class="code_line">/* file.cpp: */</div><div class="code_line">#include &quot;file.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;class T&#62; T func (T t)</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; return t + t;</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">&nbsp;</div><div class="code_line">/* end of file.cpp */</div><div class="code_line">&nbsp;</div><div class="code_line">/* main.cpp: */</div><div class="code_line">#include &quot;file.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">int main ()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;float f;</div><div class="code_line">&nbsp;&nbsp; &nbsp;double d;</div><div class="code_line">&nbsp;&nbsp; &nbsp;func (f); // OK - Sun CC</div><div class="code_line">&nbsp;&nbsp; &nbsp;func (d); // OK - Sun CC</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">/* end of main.cpp */</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>antigen</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134045&amp;view=findpost&amp;p=2608043</guid>
        <pubDate>Sun, 30 May 2010 01:50:58 +0000</pubDate>
        <title>Шаблоны: unresolved external symbol</title>
        <link>https://forum.sources.ru/index.php?showtopic=134045&amp;view=findpost&amp;p=2608043</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=134045&view=findpost&p=2607666'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>antigen &#064; <time class="tag-quote__quoted-time" datetime="2010-05-29T16:56:39+00:00">29.05.10, 16:56</time></span><div class='quote '>(<span class="tag-color tag-color-named" data-value="red" style="color: red">определение</span> шаблона - в заголовке, <span class="tag-color tag-color-named" data-value="red" style="color: red">описание</span> шаблона - в одном файле, использование - в другом)</div></div>Ты, наверно, имел в виду, &quot;<span class="tag-color tag-color-named" data-value="blue" style="color: blue">объявление</span> шаблона - в заголовке, <span class="tag-color tag-color-named" data-value="blue" style="color: blue">определение</span> шаблона - в одном файле, использование - в другом&quot;? <strong class='tag-b'>B.V.</strong>, кажись, 8-ая фаза с её 3-им способом в действии.]]></description>
        <author>Qraizer</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134045&amp;view=findpost&amp;p=2607666</guid>
        <pubDate>Sat, 29 May 2010 16:56:39 +0000</pubDate>
        <title>Шаблоны: unresolved external symbol</title>
        <link>https://forum.sources.ru/index.php?showtopic=134045&amp;view=findpost&amp;p=2607666</link>
        <description><![CDATA[antigen: Возможность разносить описание шаблона и его использование по разным единицам трансляции так же предоставляет сановский компилятор (входящий в состав Sun Studio). Правда на ключевое слово &quot;export&quot; компилятор кладёт толстый болт, выдавая варнинг - &quot;Export ignored -- not yet implemented.&quot;, но при этом сама такая возможность (определение шаблона - в заголовке, описание шаблона - в одном файле, использование - в другом) - реализована.]]></description>
        <author>antigen</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134045&amp;view=findpost&amp;p=1944308</guid>
        <pubDate>Fri, 02 May 2008 13:09:19 +0000</pubDate>
        <title>Шаблоны: unresolved external symbol</title>
        <link>https://forum.sources.ru/index.php?showtopic=134045&amp;view=findpost&amp;p=1944308</link>
        <description><![CDATA[antigen: <a class='tag-url' href='http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1426.pdf' target='_blank'>Почему разработчики компиляторов не торопятся с поддержкой экспорта шаблонов</a>. Герб Саттер рассказывает какие трудности возникают при решении этой задачи.]]></description>
        <author>antigen</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134045&amp;view=findpost&amp;p=1843771</guid>
        <pubDate>Tue, 22 Jan 2008 11:28:13 +0000</pubDate>
        <title>Шаблоны: unresolved external symbol</title>
        <link>https://forum.sources.ru/index.php?showtopic=134045&amp;view=findpost&amp;p=1843771</link>
        <description><![CDATA[T0ad: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=134045&view=findpost&p=1026288'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>antigen &#064; <time class="tag-quote__quoted-time" datetime="2006-02-25T13:55:18+00:00">25.02.06, 13:55</time></span><div class='quote '>второй вариант: частичная специализация. Если известо, какой тип будет параметром заполнения шаблона,<br>
то можно явно сгенерить его методы в отдельной единице трансляции:<br>
/* file.h - описание шаблона */<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;class T&#62; class C</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; public :</div><div class="code_line">&nbsp;&nbsp; C (void);</div><div class="code_line">&nbsp;&nbsp; private :</div><div class="code_line">&nbsp;&nbsp; T t;</div><div class="code_line">&nbsp;&nbsp; };</div><div class="code_line">template &#60;&#62; C &#60;float&#62;::C(void);</div></ol></div></div></div></div></div></div><br>
<em class='tag-i'>template &lt;&gt; C &lt;float&gt;::C(void)</em> это НЕ частичная специализация, а явная(полная) специализация члена(конструктора в данном случае). Более красиво вариант 2 реализуется директивой явного инстанцирования.<br>
<strong class='tag-b'>Обобщю немного сказанное, существует несколько способов организации исходного кода шаблонов:</strong><br>
1. Наиболее популярный подход - модель включения(inclusion model), определения шаблонов полностью размещаются в заголовочном файле.<br>
2. Модель явного инстанцирования(explicit instantiation model), как правило реализуется директивой явного инстанцирования (explicit instantiation directive).<br>
3. Модель разделения шаблонов(separation model), реализуется с помощью export.]]></description>
        <author>T0ad</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134045&amp;view=findpost&amp;p=1032962</guid>
        <pubDate>Fri, 03 Mar 2006 16:49:53 +0000</pubDate>
        <title>Шаблоны: unresolved external symbol</title>
        <link>https://forum.sources.ru/index.php?showtopic=134045&amp;view=findpost&amp;p=1032962</link>
        <description><![CDATA[antigen: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=134045&view=findpost&p=1027609'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>BioUnit &#064; <time class="tag-quote__quoted-time" datetime="2006-02-26T21:36:37+00:00">26.02.06, 21:36</time></span><div class='quote '>Я бы отнесстя к поддержке такой возможности весьма скептически...<br>
Может, лишь самые простейшие случаи...<br>
</div></div><br>
<br>
Совершенно верно. Хелловорлд работает, а чо чуть посложнее - уже не компилируется.<br>
Возможно в более свежих весриях эта поддержка будет улучшена.]]></description>
        <author>antigen</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134045&amp;view=findpost&amp;p=1027609</guid>
        <pubDate>Sun, 26 Feb 2006 21:36:37 +0000</pubDate>
        <title>Шаблоны: unresolved external symbol</title>
        <link>https://forum.sources.ru/index.php?showtopic=134045&amp;view=findpost&amp;p=1027609</link>
        <description><![CDATA[BioUnit: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=134045&view=findpost&p=1026288'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>antigen &#064; <time class="tag-quote__quoted-time" datetime="2006-02-25T13:55:18+00:00">25.02.06, 13:55</time></span><div class='quote '>Из мне известных компиляторов, которые могут осилить такой код, могу назвать только<br>
- Intel C++ (версии, выпущеные позже октября 2004 г.)<br>
[список может быть продолжен]</div></div><br>
Я бы отнесстя к поддержке такой возможности весьма скептически...<br>
Может, лишь самые простейшие случаи...]]></description>
        <author>BioUnit</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134045&amp;view=findpost&amp;p=1026288</guid>
        <pubDate>Sat, 25 Feb 2006 13:55:18 +0000</pubDate>
        <title>Шаблоны: unresolved external symbol</title>
        <link>https://forum.sources.ru/index.php?showtopic=134045&amp;view=findpost&amp;p=1026288</link>
        <description><![CDATA[antigen: Товарищ Железный Феликс (aka Flex Ferrum), по моим оценкам ответил раз тридцать на этот вопрос, и, тем не менее, вопрос этот периодически возникает. Чаще всего его задают новички, но иногда и опытные программисты попадают в этот капкан.<br>
<br>
Кому не в лом, с обсуждением этой темы и предложенными решениями можно ознакомиться по следующим, напр. ссылкам:<br>
<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=133330' target='_blank'>шаблонный класс</a><br>
<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=132511' target='_blank'>Проблема с шаблоном</a><br>
<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=126270' target='_blank'>шаблонные классы</a><br>
<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=121776' target='_blank'>Шаблонные функции</a><br>
<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=118318' target='_blank'>Шаблоны (templates) в С++</a><br>
<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=101478' target='_blank'>LNK ошибка при шаблонном наследовании</a><br>
<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=97032' target='_blank'>шаблонные члены класса</a><br>
<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=99105' target='_blank'>ошибки при линковке библиотк с шаблонами</a><br>
<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=84700' target='_blank'>шаблоны</a><br>
<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=71613' target='_blank'>error LNK2019: unresolved external symbo</a><br>
<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=64025' target='_blank'>Вопрос по шаблонам</a><br>
<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=38185' target='_blank'>template&#39;s</a><br>
[список может быть продолжен]<br>
<br>
Итак, проблема:<br>
имеем в проекте, к примеру три файла file.h, file.cpp, main.cpp<br>
/* file.h - описание шаблона     */<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;class T&#62; class C</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; public :</div><div class="code_line">&nbsp;&nbsp; C (void);</div><div class="code_line">&nbsp;&nbsp; private :</div><div class="code_line">&nbsp;&nbsp; T t;</div><div class="code_line">&nbsp;&nbsp; };</div></ol></div></div></div></div><br>
/* file.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">#include &quot;file.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;class T&#62; C&#60;T&#62; :: C (void): t (1) {;}</div></ol></div></div></div></div><br>
<br>
/* main.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">#include &quot;file.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">C&#60;float&#62; c;</div><div class="code_line">&nbsp;</div><div class="code_line">int main (int, char *[])</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp;return 0;</div><div class="code_line">&nbsp;&nbsp;}</div></ol></div></div></div></div><br>
<br>
Файлы file.cpp и main.cpp транслируются раздельно. Пытаемся собрать проект, - и на этапе компоновки <br>
линкер нам сообщает о том, что какой-то symbol оказался unresolved. Сообщение об этой ошибке может <br>
зависеть от среды разработки, но в общем суть его одна.<br>
<br>
В чём же тут проблема ?<br>
А проблема в том, дорогие товарищи, что в Европе кофе не растёт.<br>
Большинство наиболее распространённых и наиболее популярных компиляторов не поддерживает это средство языка,<br>
которое называется экспорт шаблонов.<br>
В их числе:<br>
 - Компиляторы Borland C++ (все версии всех годов, правда про Builder 2006 не могу точно сказать, но <br>
скорее всего и он тоже не поддерживает);<br>
 - Microsoft C++ (тоже самое, ни один из них не поддерживает);<br>
 - GNU gcc/g++ (тоже ни одна из версий не поддерживает);<br>
<br>
Менее распространённые, но которые мне проходилось использовать:<br>
 - QNX qcc (все версии); <br>
<br>
Компиляторы для встраиваемых приложений:<br>
 - IAR EWB (все поддерживаемые процессорные ядра/устройства);<br>
 - Green Hills Multi2000; <br>
 - Analog Devices Visual DSP++ (все версии);<br>
 - Texas Instruments Code Composer;<br>
[список может быть продолжен]<br>
<br>
В некоторых средах разработки, например таких как Microsoft VS, Green Hills, или GNU gcc об этом<br>
явно сообщается в документации. <br>
<br>
Из мне известных компиляторов, которые могут осилить такой код, могу назвать только<br>
  - Intel C++ (версии, выпущеные позже октября 2004 г.)<br>
[список может быть продолжен]<br>
 <br>
<br>
Как решать эту проблему ?<br>
Наиболее простой ответ: на этапе трансляции описание шаблона, определение шаблона, и его<br>
использование должно находится в одной единице трансляции. На примере вышеприведённого кода можно <br>
сделать так : <br>
/* file.h - описание шаблона     */<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;class T&#62; class C</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; public :</div><div class="code_line">&nbsp;&nbsp; C (void) : t (1) {;}</div><div class="code_line">&nbsp;&nbsp; private :</div><div class="code_line">&nbsp;&nbsp; T t;</div><div class="code_line">&nbsp;&nbsp; };</div></ol></div></div></div></div><br>
/* main.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">#include &quot;file.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">C&#60;float&#62; c;</div><div class="code_line">&nbsp;</div><div class="code_line">int main (int, char *[])</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp;return 0;</div><div class="code_line">&nbsp;&nbsp;}</div></ol></div></div></div></div><br>
определение шаблонного метода выкидываем из file.cpp <br>
<br>
или вот так, если в лом переписывать заголовок:<br>
<br>
/* file.h - описание шаблона     */<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;class T&#62; class C</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; public :</div><div class="code_line">&nbsp;&nbsp; C (void);</div><div class="code_line">&nbsp;&nbsp; private :</div><div class="code_line">&nbsp;&nbsp; T t;</div><div class="code_line">&nbsp;&nbsp; };</div></ol></div></div></div></div><br>
/* file.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">#include &quot;file.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;class T&#62; C&#60;T&#62; :: C (void): t (1) {;}</div></ol></div></div></div></div><br>
<br>
/* main.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">#include &quot;file.h&quot;</div><div class="code_line">#include &quot;file.cpp&quot; /* брррр...... ахтунг, но работать будет*/</div><div class="code_line">&nbsp;</div><div class="code_line">C&#60;float&#62; c;</div><div class="code_line">&nbsp;</div><div class="code_line">int main (int, char *[])</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp;return 0;</div><div class="code_line">&nbsp;&nbsp;}</div></ol></div></div></div></div><br>
<br>
второй вариант: частичная специализация. Если известо, какой тип будет параметром заполнения шаблона,<br>
то можно явно сгенерить его методы в отдельной единице трансляции:<br>
<br>
/* file.h - описание шаблона     */<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;class T&#62; class C</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; public :</div><div class="code_line">&nbsp;&nbsp; C (void);</div><div class="code_line">&nbsp;&nbsp; private :</div><div class="code_line">&nbsp;&nbsp; T t;</div><div class="code_line">&nbsp;&nbsp; };</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;&#62; C &#60;float&#62; :: C (void);</div></ol></div></div></div></div><br>
/* file.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">#include &quot;file.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;&#62; C&#60;float&#62; :: C (void): t (3.1415) {;}</div></ol></div></div></div></div><br>
/* main.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">#include &quot;file.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">C&#60;float&#62; c;</div><div class="code_line">&nbsp;</div><div class="code_line">int main (int, char *[])</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp;return 0;</div><div class="code_line">&nbsp;&nbsp;}</div></ol></div></div></div></div><br>
<br>
Такой вариант тоже работоспособен.<br>
<br>
<br>
В догон. Какие шаблоны практически удаётся скомпилять в раздельных<br>
единицах трансляции? С применением вышеупомянутого Intel C++ мне удалось <br>
скомпилировать шаблонную функцию объявленную в одном файле, а определённую в другом.<br>
Как это выглядит (icc 8.1, Linux FC2) <br>
<br>
/* file.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">#include &#60;stdio.h&#62;</div><div class="code_line">#include &#60;typeinfo&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">export template &#60;class T&#62; T f (T a) </div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp;printf (&quot;type of v : %s\n&quot;, typeid (a).name ());</div><div class="code_line">&nbsp;&nbsp;return a + 1;</div><div class="code_line">&nbsp;&nbsp;}</div></ol></div></div></div></div><br>
<br>
/* main.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">export template&#60;class T&#62; T f (T);</div><div class="code_line">&nbsp;</div><div class="code_line">float s = 3.1415;</div><div class="code_line">double d = 2.71828;</div><div class="code_line">const char * c = &quot;hello world\n&quot;;</div><div class="code_line">&nbsp;</div><div class="code_line">int main () </div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp;f (s);</div><div class="code_line">&nbsp;&nbsp;f (d);</div><div class="code_line">&nbsp;&nbsp;f (c);</div><div class="code_line">&nbsp;&nbsp;return 0;</div><div class="code_line">&nbsp;&nbsp;}</div></ol></div></div></div></div><br>
<br>
командная строка:<br>
<span class="tag-color tag-color-named" data-value="black" style="color: black"><br>
[user@work template]&#036; icpc -export -export_dir ./ -c file.cpp<br>
[user@work template]&#036; icpc -export -export_dir ./ -c main.cpp<br>
[user@work template]&#036; icpc -export -export_dir ./ file.o main.o -o test<br>
[user@work template]&#036; ./test<br>
type of v : f<br>
type of v : d<br>
type of v : PKc</span><br>
<br>
<br>
ну и так должен выглядеть правильно код, приведённый в самом начале темы, <br>
что бы он был правильно понят компилятором:  <br>
<br>
/* file.h - описание шаблона     */<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;class T&#62; class C</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; public :</div><div class="code_line">&nbsp;&nbsp; C (void);</div><div class="code_line">&nbsp;&nbsp; private :</div><div class="code_line">&nbsp;&nbsp; T t;</div><div class="code_line">&nbsp;&nbsp; };</div><div class="code_line">&nbsp;</div><div class="code_line">export template &#60;class T&#62; C &#60;T&#62; :: C (void);</div></ol></div></div></div></div><br>
/* file.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">#include &#60;stdio.h&#62;</div><div class="code_line">#include &#60;typeinfo&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">export template &#60;class T&#62; C&#60;T&#62; :: C (void) : t (1.4142)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp;t += 1;</div><div class="code_line">&nbsp;&nbsp;printf (&quot; v = %f, type = %s\n&quot;, t, typeid (t).name ());</div><div class="code_line">&nbsp;&nbsp;}</div></ol></div></div></div></div><br>
<br>
/* main.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">#include &quot;file.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">C&#60;float&#62; c;</div><div class="code_line">&nbsp;</div><div class="code_line">int main (int, char *[])</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp;return 0;</div><div class="code_line">&nbsp;&nbsp;}</div></ol></div></div></div></div><br>
<br>
командная строка :<br>
[user@work template]&#036; icpc -export -export_dir ./ -c file.cpp<br>
[user@work template]&#036; icpc -export -export_dir ./ -c main.cpp<br>
[user@work template]&#036; icpc -export -export_dir ./ file.o main.o -o test<br>
[user@work template]&#036; ./test<br>
 v = 2.414200, type = f<br>
<br>
Да только, как уже было показано выше, такой код очень немногим компиляторам по зубам.<br>
<br>
Успехов всем&#33;]]></description>
        <author>antigen</author>
        <category>C/C++ FAQ</category>
      </item>
	
      </channel>
      </rss>
	