как создать шаблонную функцию в классе? (c++)

<p>я знаю, что можно сделать функцию шаблона:</p><pre><code>template<typename t> void dosomething(t x){} </code></pre><p>и можно сделать шаблон класса:</p><pre><code>template<typename t> class object { public: int x; }; </code></pre><p>но возможно ли сделать класс не в шаблоне, а затем сделать функцию в этом классе шаблоном? то есть:</p><pre><code>//i have no idea if this is right, this is just how i think it would look class object { public: template<class t> void dox(){} }; </code></pre><p>или что-то в той степени, где класс не является частью шаблона, но функция?</p>

<p>ваше предположение является правильным. единственное, что вы должны помнить, это то, что шаблон функции-члена <em>definition</em> (в дополнение к объявлению) должен находиться в заголовочном файле, а не в cpp, хотя он <em>not</em> должен находиться в теле самого объявления класса.</p>

<p>смотрите здесь: <a href="http://www.cs.otago.ac.nz/postgrads/alexis/tutorial/node39.html">шаблоны</a> , <a href="http://www.cs.otago.ac.nz/postgrads/alexis/tutorial/node42.html">методы шаблона</a> , шаблоны-члены, шаблоны функций-членов</p><pre><code>class vector { int array[3]; template <class tvector2> void eqadd(tvector2 v2); }; template <class tvector2> void vector::eqadd(tvector2 a2) { for (int i(0); i < 3; ++i) array[i] += a2[i]; } </code></pre>

<p>да, функции-члены шаблона совершенно легальны и полезны во многих случаях.</p><p>единственное предостережение в том, что функции-члены шаблона не могут быть виртуальными.</p>

<p>самый простой способ - поместить объявление и определение в один и тот же файл, но это может привести к превышению размера исполняемого файла. например.</p><pre><code>class foo { public: template <typename t> void some\_method(t t) {//...} } </code></pre><p>также возможно поместить определение шаблона в отдельные файлы, т.е. поместить их в файлы .cpp и .h. все, что вам нужно сделать, это явно включить экземпляр шаблона в файлы .cpp. например.</p><pre><code>// .h file class foo { public: template <typename t> void some\_method(t t); } // .cpp file //... template <typename t> void foo::some\_method(t t) {//...} //... template void foo::some\_method<int>(int); template void foo::some\_method<double>(double); </code></pre>