2

他の多くのコンテナー、式テンプレート、およびリテラル型のためにオーバーロードする必要があるコンテナーtemplate <typename T> class Aがあります。operator+U

wrap私の現在の戦略は、個々の要素へのアクセス方法と定義方法をカプセル化するテンプレート関数を定義することです。

template <typename T, typename U>
auto operator+(Wrapped<T>&& lhs, Wrapped<U>&& rhs) -> decltype(...)
{
    ....
}

operator+ただし、次のオーバーロードはあいまいです。

template <typename T, typename U>
auto operator+(const A<T>& lhs, U&& rhs) ->
    decltype(wrap(lhs) + wrap(std::forward<U>(rhs)))
{
    return wrap(lhs) + wrap(std::forward<U>(rhs));
}

template <typename T, typename U>
auto operator+(T&& lhs, const A<U>& rhs) ->
    decltype(wrap(std::forward<T>(lhs)) + wrap(rhs))
{
    return wrap(std::forward<T>(lhs)) + wrap(rhs);
}

あいまいさを最もよく解決するにはどうすればよいですか?

4

1 に答える 1

2

あいまいな引数の両方よりも優れたオーバーロードテンプレートを提供する必要があります。

template<typename T>
auto operator+(const A<T> &lhs, const A<T> &rhs) -> ...;

template<typename T, typename U>
auto operator+(const A<T> &lhs, const A<U> &rhs) -> ...;
于 2012-08-22T11:51:43.663 に答える