具有两个参数的模板与两个模板的两个声明之间的差异,每个模板具有一个参数

时间:2013-07-08 07:49:02

标签: c++ templates

接下来的两个声明之间会有什么区别:

template<class T, class functor>
methodReturnType className::methodName(functor f)

template<class T>
template<class functor>
methodReturnType className::methodName(functor f)

我正在尝试编写一个可以与仿函数arg一起使用的方法。 第二个声明允许我避免将整个类声明为 T 仿函数的模板。我想要一个只有一个参数 T 的模板类 className ,但是在该类中,一个方法有另一个参数 functor ,而没有声明整个类作为两个参数的模板。 它有效,但我没有完全理解它。

2 个答案:

答案 0 :(得分:3)

根据语言规则,第二种变体适合您的情况。

n3376 14.5.2 / 1

成员 应使用指定在其类模板定义之外定义的类模板的模板 类模板的模板参数,后跟成员模板的模板参数。

[例如:

template<class T> struct string {
template<class T2> int compare(const T2&);
template<class T2> string(const string<T2>& s) { /∗ ... ∗/ }
};
template<class T> template<class T2> int string<T>::compare(const T2& s) {
}

- 结束示例]

答案 1 :(得分:3)

第一个是类的(非模板)成员函数 模板template< typename T, typename functor > class className。第二个是成员函数模板 类模板template <typename T> class className,例如:

首先:

template <typename T, class Functor >
class ClassName
{
ReturnType functionName( Functor f );
};

第二

template <typename T>
class ClassName
{
template <typename Functor>
ReturnType functionName( Functor f );
};

你说你没有完全理解它,但你似乎 掌握了必要的:在第二种情况下,班级 模板只有一个参数,但即使在实例化后也是如此 (类型T的定义),成员函数仍然存在 一个模板,可以通过许多不同的类型进行实例化。 因为它是一个函数模板,模板参数 扣除适用,因此您不必指定类型;该 当你调用时,编译器会自行解决它 功能