【发布时间】:2020-04-30 22:36:52
【问题描述】:
我正在学习如何使用 std::chrono 并且我想让模板类 Timer 易于使用(在 timer.h 中定义)。测试程序很成功,一切正常,直到我尝试在一个定义了一些模板运算符的程序中使用我的新 Timer,这与 Timer 中使用的运算符冲突。
在 Timer 内部,我必须在 std::chrono::time_point 类型的两个变量(start_time 和 end_time)之间使用 operator-,才能获得包含经过时间的 duration 变量。
在另一个标头 (algebra.h) 中,我实现了二进制 operator- 的重载,以区分两个 std::vector 或两个 std::array,或者还提供了一个用户定义的容器 operator[] 和 @ 987654332@成员函数。
template<typename pointType>
pointType operator-(pointType a, const pointType & b){
for(int i = 0; i < a.size(); ++i){
a[i] = a[i] - b[i];
}
return a;
}
当我尝试同时包含 timer.h 和 algebra.h 时,编译器会抛出一个错误,提示“运算符重载不明确”,建议可能的候选者是 algebra.h 中的运算符和 @987654337 中实现的运算符@。
我不明白为什么它是模棱两可的,因为pointType 不能被推断为std::chrono::time_point,因为它没有operator[] 和size() 成员函数。
附:我尝试了其他方法来解决它,但我只是在测试使用std::valarray 的程序时更加困惑。当我同时包含<valarray> 和"algebra.h" 并尝试在两个valarray 之间做出区别时,我希望编译器会抱怨operator- 的模糊定义,因为std::valarray 已经实现了二元运算符。但这不会发生:它使用<valarray> 实现进行编译。为什么这不会引发错误?
【问题讨论】:
-
简而言之,对于没有您编写的类的操作数的情况,您不应该添加运算符重载。操作员的名称查找可能找不到它。
标签: c++ operator-overloading ambiguous template-argument-deduction