Próbuję napisać szablonów funkcji operatora spoza UE, takich jak:W jaki sposób można użyć enable_if do wzajemnie wykluczających się szablonów funkcji nie będących członkami?
#include <utility>
template < typename T, unsigned L >
class MyType;
template < typename T, typename U, unsigned L >
auto operator ==(MyType<T,L> const &l, MyType<U,L> const &r)
-> decltype(std::declval<T>() == std::declval<U>())
{ /*...*/ }
Ale gdy próbuję obsłużyć gdy l
i r
mają różne długości:
template < typename T, unsigned Lt, typename U, unsigned Lu, class Enable = typename std::enable_if<(Lt < Lu)>::type >
auto operator ==(MyType<T,Lt> const &l, MyType<U,Lu> const &r)
-> decltype(std::declval<T>() == std::declval<U>())
{ /*...*/ }
template < typename T, unsigned Lt, typename U, unsigned Lu, class Enable = typename std::enable_if<(Lt > Lu)>::type >
auto operator ==(MyType<T,Lt> const &l, MyType<U,Lu> const &r)
-> decltype(std::declval<T>() == std::declval<U>())
{ /*...*/ }
otrzymuję błędy dwuznaczności. Próbowałem coś takiego:
które przeczytałem (tutaj na S.O.), aby rozwiązać problemy takie jak to dla szablonów funkcji członkowskich. (Czasami respondenci zmienili funkcję członka na szablon funkcji członka, aby to umożliwić). Ale błędy nie zmieniają się dla mnie. Czy muszę przełączyć się na wprowadzanie enable_if
do typu zwrotu?
Och, wyrażenie typu zwrotu ma na celu wykluczenie tego operatora, gdy nie można porównać dwóch typów elementów. Czy to rzeczywiście zadziała? Czy jest on kompatybilny z umieszczaniem tam również kamery enable_if
?
Czym dokładnie jest błąd dwuznaczności? –