我写了一个模板化的容器类MyCont:
#include <iostream>
template <class T>
class MyCont
{
public:
void SomeFunc();
T* list;
};
template <class T>
void MyCont<T>::SomeFunc()
{
std::cout<<"in function"<<std::endl;
//...
}
int main()
{
MyCont<int> y;
y.SomeFunc();
MyCont< MyCont<int> > x;
x.SomeFunc();
}
这很好用。但是,在MyCont具有MyCont类型的情况下,我希望能够改变SomeFunc()的行为。 我不知道该怎么做(或者即使它可能)。我尝试在SomeFunc()的第一个定义下面添加它:
template <>
void MyCont< MyCont<class T> >::SomeFunc()
{
std::cout<<"in altered function"<<std::endl;
//...
}
这是编译,但它始终是第一个被称为
的SomeFunc由于
答案 0 :(得分:0)
这实际上是一种有趣的案例。我想你打算写
template <class T>
void MyCont< MyCont<T> >::SomeFunc()
{
std::cout<<"in altered function"<<std::endl;
//...
}
无法编译。相反,你写了
template <>
void MyCont< MyCont<class T> >::SomeFunc()
{
std::cout<<"in altered function"<<std::endl;
//...
}
在您的课程之外,所以错位的class T
向前声明了T
类型。这意味着编译器生成一个MyCont
特化的函数,该函数不存在,因此不使用。
要了解我的意思,请在主模板后添加以下专业:
template <class T>
struct MyCont< MyCont<T> > : MyCont<T>
{
void SomeFunc();
};
现在将调用第一个固定版本。没有课程的专业化,你就无法实现你想要的目标。
答案 1 :(得分:-1)
您必须部分专门化仅使用完整类型的模板,以允许编译器为每种类型生成单独的代码,此修改示例按预期工作,但它看起来不再那么灵活(严格MyCont T = int绑定):< / p>
#include <iostream>
template <class T>
class MyCont
{
public:
void SomeFunc();
T* list;
};
template <class T>
void MyCont<T>::SomeFunc()
{
std::cout<<"in function"<<std::endl;
//...
}
template <>
void MyCont< int >::SomeFunc()
{
std::cout<<"in altered function"<<std::endl;
//...
}
int main()
{
MyCont<int> y;
y.SomeFunc();
MyCont< MyCont<int> > x;
x.SomeFunc();
}