ほとんどの操作が実装されているクラスAがあります。また、私はAのメンバーだけを含む別のクラスBを持っています。そして、私はAの操作をBに直接適用することができます。私は変換操作を定義します。しかし、コンパイラは "エラー: 'foo'への呼び出しに一致する関数はありません。暗黙の変換で何が問題なのですか?これを実装する方法は?ありがとう。テンプレート関数の暗黙的な変換
編集:演算子のオーバーロードをAに追加してBに直接使用させたい場合はどうすればよいですか?
template <typename T> struct B;
template <typename T>
struct A {
A(const B<T>& b) {} // Conversion from B to A, way 1
friend void foo(const A&);
// Addition
friend A operator+(const A&, const A&);
};
template <typename T>
void foo(A<T>& a) {}
// Addition
template <typename T>
A<T> operator+(const A<T>& a1, const A<T>& a2) { return A<T>(); }
template <typename T>
struct B {
B() {}
A<T> a;
operator A<T>() { return a; } // Conversion from B to A, way 2
// Addition
B(const A<T>& a) : a(a) {}
};
int main()
{
B<int> b;
foo(b);
auto bb = b+b;
}
'foo'はテンプレートです。あなたは議論の控除を必要とする方法でそれを呼び出します。変換はできません。 – StoryTeller
@StoryTellerそれを正しくするために何が必要です – zhangwfjh