I'm learning how to use std::chrono and I want to make a template class Timer easy to use (defined in timer.h
). The testing program was successful and everything worked fine, until I tried to use my new Timer in a program with the definition of some template operators, which conflit with the operators used inside Timer.
Inside Timer I have to use operator-
between two variables (start_time
and end_time
) of type std::chrono::time_point
, in order to obtain the duration
variable containing the elapsed time.
In another header (algebra.h
) I implemented the overloading of the binary operator-
to make the difference between two std::vector
or two std::array
, or also a user-defined container provided with operator[]
and size()
member function.
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;
}
When I try to include both timer.h
and algebra.h
, the compiler throws an error saying "ambiguous overload for operator-" suggesting, as possible candidates, both the operator in algebra.h
and the one implemented in <chrono>
.
I don't understand why it is ambiguous, since pointType
can't be deduced as std::chrono::time_point
because it doesn't have operator[]
and size()
member function.
P.S. I tried something else to work it out, but I only got more confused testing a program which use std::valarray
. When I include both <valarray>
and "algebra.h"
, and try to make a difference between two valarrays, I expected the compiler to complain about ambiguous definition of operator-
, since std::valarray
already has implementation for binary operators. But this doesn't happen: it compiles using the <valarray>
implementation. Why this doesn't throw an error?
Aucun commentaire:
Enregistrer un commentaire