C++模板 - 多种类型

Sys*_*min 33 c++ templates

考虑以下模板类.

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

template <class T>
void MyClass<T>::MyFunc()
{
  //...implementation goes here
}
Run Code Online (Sandbox Code Playgroud)

我需要添加另一个函数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
}
Run Code Online (Sandbox Code Playgroud)

我正在使用VS 2008编译器.我收到了错误

error C2244: unable to match function definition to an existing declaration
Run Code Online (Sandbox Code Playgroud)

在这种情况下,函数定义和声明应该如何.

Chu*_*dad 32

template <class T>
template <class T2> 
void MyClass<T>::MyFunc2(T2* pData) 
{ 
  //...implementation goes here 
}
Run Code Online (Sandbox Code Playgroud)

编辑2:

$ 14.5.2/1 - "模板可以在类或类模板中声明;这样的模板称为成员模板.成员模板可以在其类定义或类模板定义之内或之外定义.成员模板这是它的类模板定义之外定义的类模板应与类模板接着构件模板的模板参数的模板的参数来指定. "

  • 我总是觉得这种语法很尴尬,嵌套类也不会更好... (2认同)

bob*_*obo 24

你正在做的很好,试试看:

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;
}
Run Code Online (Sandbox Code Playgroud)

这段代码有效.如果您遇到奇怪的错误,请查看您是否仅使用1个模板参数进行声明 Structure(这就是我正在做的事情).