专门用于模板化容器类的成员函数

时间:2013-10-05 15:13:42

标签: c++ template-specialization

我写了一个模板化的容器类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

由于

2 个答案:

答案 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();
};

现在将调用第一个固定版本。没有课程的专业化,你就无法实现你想要的目标。

Live example

答案 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();
}