2

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

谢谢

4

2 回答 2

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放错位置的 向前声明了一个 type T。这意味着编译器会生成一个专门化的函数,该函数MyCont不存在因此未被使用。

要了解我的意思,请在主模板之后添加以下专业化:

template <class T>
struct MyCont< MyCont<T> > : MyCont<T>
{
    void SomeFunc();
};

现在将调用第一个固定版本。如果没有专业化的课程,您将无法实现您正在寻找的东西。

活生生的例子

于 2013-10-05T15:23:57.507 回答
-1

您必须仅对具有完整类型的模板进行部分特化,以允许编译器为每种类型生成单独的代码,这个修改后的示例按您的预期工作,但是它看起来不再那么灵活(严格的 MyCont T=int 绑定):

#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();
}
于 2013-10-05T15:48:57.660 回答