Шаблон C ++ - несколько типов - PullRequest
33 голосов
/ 21 октября 2010

рассмотрим следующий класс шаблона.

template <class T>
class MyClass
{
   void MyFunc();
}

template <class T>
void MyClass<T>::MyFunc()
{
  //...implementation goes here
}

Мне нужно добавить еще одну функцию MyFunc2 , которая принимает дополнительный Шаблон arg T2 то есть

template <class T>
class MyClass
{
   void MyFunc();

   template <class T2>
   static void MyFunc2(T2* data);
}

template <class T>
void MyClass<T>::MyFunc()
{
  //...implementation goes here
}

template <class T, class T2>
void MyClass<T>::MyFunc2(T2* pData)
{
  //...implementation goes here
}

Я использую компилятор VS 2008. Я получаю ошибку

error C2244: unable to match function definition to an existing declaration

Как должны выглядеть определение и объявление функции в этом случае.

Ответы [ 3 ]

33 голосов
/ 21 октября 2010
template <class T>
template <class T2> 
void MyClass<T>::MyFunc2(T2* pData) 
{ 
  //...implementation goes here 
}

РЕДАКТИРОВАТЬ 2:

$ 14.5.2 / 1 - "Шаблон может быть объявлен внутри класса или шаблона класса; такой шаблон называется шаблоном элемента. Шаблон элемента можетбыть определенным в пределах или вне его определения класса или определения шаблона класса. Шаблон элемента шаблона класса, который определен вне определения его шаблона класса, должен быть указан с параметрами шаблона шаблона класса, сопровождаемыми параметрами шаблонашаблона участника."

23 голосов
/ 03 мая 2013

То, что вы делаете, хорошо, попробуйте это:

template <typename S,typename T>
struct Structure
{
  S s ;
  T t ;

} ;

int main(int argc, const char * argv[])
{
  Structure<int,double> ss ;
  ss.s = 200 ;
  ss.t = 5.4 ;

  return 1;
}

Этот код работает. Если вы получаете странные ошибки, посмотрите, объявили ли вы forward Structure, используя только 1 параметр шаблона (это то, что я делал).

1 голос
/ 03 января 2019

Попробуйте это:

template <class T, class T2>
class MyClass
{
public:
    static void MyFunc2(T2* data);
};

template <class T, class T2>
void MyClass<T, T2>::MyFunc2(T2* pData)
{
    cout << "dummy " << *pData<< "\n";
}

Тогда

int main()
{
    cout << "Hello World!\n"; 
    MyClass<int, int> a;
    int *b = (int*)malloc(sizeof(int));
    *b = 5;
    a.MyFunc2(b);
}

выход

Hello World!
dummy 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...