6

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

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

和:

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

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

4

2 回答 2

3

第一个是类 template 的(非模板)成员函数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),成员函数仍然是一个模板,这可以在许多不同的类型上实例化。并且由于是函数模板,所以模板参数推导适用,所以你不必指定类型;当您调用该函数时,编译器会自行解决。

于 2013-07-08T08:08:15.660 回答
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) {
}

—结束示例]

于 2013-07-08T07:51:25.850 回答