これは、そこにいるC++の達人向けです。
次のコードを検討してください。
class X { };
template <class T>
class Mistake {
public:
T x;
Mistake(const T& k) : x(k) { }
Mistake(const X&) : x(1) { }
void print() { cout << x << endl; }
};
template <class T>
Mistake<T> operator+(const Mistake<T>& a, const Mistake<T>& b)
{
return Mistake<T>(a.x + b.x);
}
足し算をしたいクラス「ミス」があります。私がしようとすると:
X a, b;
Mistake<int> foo = a + b;
コンパイル エラーが発生します。コンパイラは、テンプレート operator+ をインスタンス化する必要があることを認識できないようです。
一方、前に次のコードを追加するとします。
Mistake<int> operator+(const Mistake<int>& a, const Mistake<int>& b)
{
return Mistake<int>(a.x + b.x);
}
その後、すべてが順調です。誰でも理由がわかりますか?クラス X からクラス Mistake への型変換が必要なため、コンパイラが何をインスタンス化するかを判断できないと思われますが、テンプレートをまったく使用しない以外に、この問題を修正する方法がわかりません。
ちなみに、クラス内で演算子をフレンドとして定義してもうまくいきません。
ありがとう!