Как создать шаблонную функцию в классе? (C ++) - PullRequest
134 голосов
/ 09 июня 2009

Я знаю, что можно создать шаблонную функцию:

template<typename T>
void DoSomeThing(T x){}

и возможно сделать шаблон класса:

template<typename T>
class Object
{
public:
    int x;
};

но возможно ли сделать класс не в шаблоне, а затем сделать функцию в этом классе шаблоном? То есть:

//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(){}
};

или что-то в той степени, когда класс не является частью шаблона, а функция есть?

Ответы [ 4 ]

106 голосов
/ 09 июня 2009

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

64 голосов
/ 09 июня 2009

См. Здесь: Шаблоны , методы шаблонов , шаблоны элементов, шаблоны функций элементов

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];
}
19 голосов
/ 11 июня 2009

Да, функции-члены шаблона совершенно легальны и полезны во многих случаях.

Единственное предостережение в том, что функции-члены шаблона не могут быть виртуальными.

2 голосов
/ 31 июля 2018

Самый простой способ - поместить объявление и определение в один и тот же файл, но это может привести к изменению размера файла. Э.Г.

class Foo
{
public:
template <typename T> void some_method(T t) {//...}
}

Также возможно поместить определение шаблона в отдельные файлы, т.е. поместить их в файлы .cpp и .h. Все, что вам нужно сделать, это явно включить экземпляр шаблона в файлы .cpp. Э.Г.

// .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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...