我在代码中重载了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)
答案 0 :(得分:1)
您似乎正在定义一个运算符,该运算符处理此命名空间之外的名称空间std
中定义的类型。这是有道理的,因为不允许像在命名空间std
中一样重载它:它需要至少涉及一个用户定义的类型,以允许它重载命名空间std
)。 / p>
当模板被实例化时,取决于模板参数的函数只能使用参数相关的查找来查找。 ADL仅在与参数关联的名称空间中查找名称。在您的示例中,唯一关联的命名空间是std
。