演算子が定義されているテンプレートラッパークラスがあるこの非常に単純な例を考えてみましょう:
template <class T>
struct W {
W(const T&) {}
};
template <class T>
T operator + (const W<T>& w1, const W<T>& w2) { return T(); }
そして、これは驚くべきことに、gcc4.5.1 からの単純なエラーが見つかりませんoperator + (A,A)
:
struct A {};
int main() {
A a1, a2;
A a3 = a1 + a2;
}
非テンプレートラッパーをテストして理由を見つけようとしましたが、このバージョンは機能します:
struct A {};
struct WA {
WA(const A&) {}
};
A operator + (const WA& w1, const WA& w2) { return A(); }
int main() {
A a1, a2;
A a3 = a1 + a2;
}
このような引数の一致の違いの理由と、テンプレート バージョンを機能させるにはどうすればよいでしょうか。
[アップデート]
私はあなたの答えを考慮し、例を少し反対の方法に変更しましたが、結果は同じです.テンプレートバージョンは演算子 + がないことを訴えていますが、非テンプレートは正常に動作します. これで、明示的なラッパー クラスへの明示的なキャスト演算子ができました。
テンプレート バージョン
template <class T>
struct W {
};
template <class T>
T operator + (const W<T>& w1, const W<T>& w2) { return T(); }
struct A {
operator W<A>() const { return W<A>(); }
};
テンプレートではない
struct WA {
};
struct A {
operator WA() const { return WA(); }
};
A operator + (const WA& w1, const WA& w2) { return A(); }
私はこの解決策を避けようとしています:
A a3 = W(a1) + W(a2);
これが機能する見込みはありませんか?
A a3 = a1 + a2;