编译器抛出“运算符的歧义重载”

问题描述 投票:2回答:1

我正在学习如何使用std :: chrono,并且希望使模板类Timer易于使用(在timer.h中定义)。测试程序成功完成,并且一切正常,直到我尝试在定义了一些模板运算符的程序中使用新的Timer为止,这些模板运算符与Timer内部使用的运算符相冲突。

内部定时器我必须在类型为operator-的两个变量(start_timeend_time)之间使用std::chrono::time_point,以获得包含经过时间的duration变量。

[在另一个标头(algebra.h)中,我实现了二进制文件operator-的重载,以使两个std::vector或两个std::array或具有operator[]和[C0 ]成员函数。

size()

[当我尝试同时包含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中实现的运算符。 。

我不明白为什么它是模棱两可的,因为<chrono>由于没有pointTypestd::chrono::time_point成员函数而不能推导出为operator[]

P.S。我尝试了其他方法来解决这个问题,但是测试使用size()的程序时,我只会感到更加困惑。当我同时包含std::valarray<valarray>并尝试在两个valarray之间进行区分时,我希望编译器会抱怨"algebra.h"的定义不明确,因为operator-已经具有二进制运算符的实现。但这不会发生:它使用std::valarray实现进行编译。为什么这不会引发错误?

我正在学习如何使用std :: chrono,并且希望使模板类Timer易于使用(在timer.h中定义)。测试程序成功完成,并且一切正常,直到我尝试使用我的...

c++ operator-overloading ambiguous template-argument-deduction
1个回答
0
投票

这是模棱两可的,因为编译器仅查看函数签名以测试歧义,而不是函数主体。在您的示例中,这是函数签名:

© www.soinside.com 2019 - 2024. All rights reserved.