这两个声明有什么区别?
template<typename T, typename U>
template<typename T> template<typename U>
在这个问题的接受答案中含糊不清地解释了这一点: "too many template-parameter-lists" error when specializing a member function
我知道他们不是一回事,但我很难找到教导后者使用的资源。非常感谢解释和示例。
答案 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 */ }
};