У вас есть другая проблема в вашей программе:
BinaryObserver<int, int> mc2;
mc2.Next(0);
mc2.Next(0);
Какую из Next
вы ожидаете, что компилятор выберет в случае успеха?В ответе VIT у вас будет только один Next
, реализованный в спецификации, и его двойной вызов вызовет что-то другое.
Итак, лучшее решение - иметь разные классы IObserver
с разными именами функций для перегрузки., т.е.
class BinaryObserver : public IObserver<T1>, public IObserver1<T2>
...
mc2.Next(0);
mc2.Next1(0);
Другая возможность состоит в том, чтобы поместить один из T
s в другой контейнер.В этом примере я использовал структуру Shell:
шаблон структуры Shell {T t;Оболочка (T t): t (t) {} оператор T () const {return t;}};
template <typename T1, typename T2>
class BinaryObserver : public IObserver<T1>, public IObserver<Shell<T2>> {
public:
void Next(const T1& value) noexcept override{T1 t = value;};
void Next(const Shell<T2>& value) noexcept override{T2 t = value;};
};
...
BinaryObserver<int, float> mc1;
mc1.Next(0);
mc1.Next(0.0f);
BinaryObserver<int, int> mc2;
mc2.Next(0);
mc2.Next(Shell<int>(0));