为什么“std :: accumulate”需要显式重载“operator +”?

时间:2013-09-05 15:18:13

标签: c++ stl

我在代码中重载了operator+

template < class T1, class T2 >
inline std::pair < T1, T2 > operator+ ( const std::pair < T1, T2 > & a, const std::pair < T1, T2 > & b )
{
    return std::make_pair < T1, T2 > ( a.first + b.first, a.second + b.second );
}

但是,以下失败

vector < pair < int, int > > v ( n );
accumulate ( v.begin( ), v.end( ), make_pair ( 0, 0 ) );

编译器抱怨

... stl_numeric.h:128:2: error: no match for 'operator+' in  ...

并强制显示以下形式:

accumulate ( v.begin( ), v.end( ), make_pair ( 0, 0 ), operator+< int, int> );

我的问题:为什么我需要明确提供operator+

特别是为什么当accumulate失败时,下面的一行就像一个魅力?

make_pair ( 2, 3 ) + make_pair ( 5, 7)

1 个答案:

答案 0 :(得分:1)

您似乎正在定义一个运算符,该运算符处理此命名空间之外的名称空间std中定义的类型。这是有道理的,因为不允许像在命名空间std中一样重载它:它需要至少涉及一个用户定义的类型,以允许它重载命名空间std)。 / p>

当模板被实例化时,取决于模板参数的函数只能使用参数相关的查找来查找。 ADL仅在与参数关联的名称空间中查找名称。在您的示例中,唯一关联的命名空间是std