接下来的两个声明之间会有什么区别:
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 ,而没有声明整个类作为两个参数的模板。 它有效,但我没有完全理解它。
答案 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
的定义),成员函数仍然存在
一个模板,可以通过许多不同的类型进行实例化。
因为它是一个函数模板,模板参数
扣除适用,因此您不必指定类型;该
当你调用时,编译器会自行解决它
功能