C ++模板 - 多种类型

时间:2010-10-21 11:09:30

标签: c++ templates

考虑以下模板类。

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 个答案:

答案 0 :(得分:33)

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

编辑2:

  

$ 14.5.2 / 1 - “模板可以   在类或类中声明   模板;这样的模板叫做a   会员模板。会员模板可以   在班级内外定义   定义或类模板   定义。 的成员模板   外部定义的类模板   其类模板定义应该   用。指定   类的模板参数   模板后面跟着   成员的模板参数   模板。

答案 1 :(得分:23)

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

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;
}

此代码有效。如果您收到奇怪的错误,请查看您是否只使用1个模板参数转发声明的 Structure(这就是我正在做的事情)。

答案 2 :(得分:1)

尝试一下:

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