两个模板类型和两个模板参数列表有什么区别?

时间:2014-03-31 13:47:07

标签: c++ templates

这两个声明有什么区别?
template<typename T, typename U>
template<typename T> template<typename U>

在这个问题的接受答案中含糊不清地解释了这一点: "too many template-parameter-lists" error when specializing a member function

我知道他们不是一回事,但我很难找到教导后者使用的资源。非常感谢解释和示例。

2 个答案:

答案 0 :(得分:3)

考虑一个需要两种类型的功能模板。这需要两个参数:

template<typename T, typename U>
bool isEqual(const T &t, const U &u) {
    return t == u;
}

现在考虑一个带有成员函数模板的类模板。这需要两个列表:

template<typename T>
struct Foo {
    template<typename U>
    void bar(const U &u);
};

template<typename T>
template<typename U>
void Foo<T>::bar(const U &u) {/*do something with u*/}

答案 1 :(得分:0)

如果您使用其他类型模板专门化类模板,也会发生这种情况。例如,请参阅此答案中MyTemplateClass如何专注于SomeRandomClass类型:https://stackoverflow.com/a/4200397

引用以防万一:

template <>
template <typename T,typename S>
class MyTemplateClass <SomeRandomClass<T,S> >
{
    void DoSomething(SomeRandomClass<T,S>& t) { /* something */ }
};