-2

我的代码超载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)
4

1 回答 1

1

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

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

于 2013-09-05T15:34:34.817 回答