Template类需要模板参数

Template class requires template arguments?

本文关键字:参数 Template      更新时间:2023-10-16

很抱歉,我不知道如何为这个问题找到一个好的标题,请随意编辑。

我有一系列类具有相同的角色,这意味着它们都实现了相同的接口(方法集)。考虑一下它们都继承自同一个抽象类(即使在最小的例子中不是这样;这不是这个问题的重点)。这些类都是模板化的。

我想定义一个使用模板参数的类,比如TU,以及以前没有模板参数的一个类A。在内部,这个新类将使用A<T>A<U>。这可能吗?欢迎使用C++11答案,如有必要,请随时添加标签。

失败的例子如下:

#include <iostream>
// ------------------------------------------------------------------------
struct eng_tag {};
struct fr_tag {};
struct sp_tag {};
// First implementation of the "talk interface"
template <class T = eng_tag> struct A
{
    void talk() { std::cout<<"Hellon"; }
};
template <> struct A<fr_tag>
{
    void talk() { std::cout<<"Salutn"; }
};
template <> struct A<sp_tag>
{
    void talk() { std::cout<<"Olan"; }
};
// Second implementations
template <class T = eng_tag> struct B
{
    void talk() { std::cout<<"Byen"; }
};
template <> struct B<fr_tag>
{
    void talk() { std::cout<<"A bientotn"; }
};
template <> struct B<sp_tag>
{
    void talk() { std::cout<<"Adiosn"; }
};
// etc...
// ------------------------------------------------------------------------
template <class T, class U, class I = A>
struct Wrapper
{
    I<T> one() { return I<T>(); }
    I<U> two() { return I<U>(); }
};
// ------------------------------------------------------------------------
int main()
{
    Wrapper<fr_tag,sp_tag,B> w;
        w.one().talk();
        w.two().talk();
}

A是一个模板,而不是一个类型。因此,您需要的是模板模板参数([1],[2]):

template <class T, class U, template<typename> class I = A>
//                          ^^^^^^^^^^^^^^^^^^^^^^^^^^ template template parameter
struct B
{
    I<T> one() { return I<T>(); }
    I<U> two() { return I<U>(); }
};