Это, если для гуру С++.
Рассмотрим следующий код:
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;
Я получаю ошибку компиляции; компилятор не может понять, что оператор шаблона + должен быть создан.
Если, с другой стороны, я добавляю следующий фрагмент кода:
Mistake<int> operator+(const Mistake<int>& a, const Mistake<int>& b)
{
return Mistake<int>(a.x + b.x);
}
тогда все хорошо. Кто-нибудь знает почему? Я подозреваю, что компилятор не может понять, что нужно создать из-за преобразования типа, необходимого из класса X в класс Ошибки, но я не знаю, как исправить эту проблему, не используя шаблоны вообще.
Кстати, определение оператора внутри класса как друга также не работает.
Спасибо!