考虑以下模板类。
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
在这种情况下,函数定义和声明应该如何。
答案 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