Уточнение перегруженного оператора
Есть сторонняя библиотека, в которой определен класс Stream с шаблонной перегрузкой оператора <<
class Stream {
private:
std::ostringstream _buffer;
public:
template<typename T>
Stream& operator<<(const T& t) {
_buffer << t;
return *this;
}
}
Теперь я в своей программе для своего класса хочу определить правило записи объекта этого класса в поток. Но т.к. Stream не является наследником ostream, а я хочу писать в любые потоки, то я у себя в программе определяю шаблонную функцию
template <typename T>
T & operator<<(T & strm, const CMyClass & val) {
.......... // Запись полей объекта
return strm;
}
Но теперь при вызове
Stream strm;
CMyClass obj;
strm << obj;
я получаю в IDE предупреждение
Use of overloaded operator '<<' is ambiguous (with operand types 'Stream' and 'CMyClass')
candidate function [with T = CMyClass]
candidate function [with T = Stream]
а при компиляции ошибку
Stream.hh(112): error C2679: binary '<<': no operator found which takes a right-hand operand of type 'const T' (or there is no acceptable conversion) with [T=CMyClass]
Т.е. мое переопределение игнорируется
Вопрос: можно ли как-то решить проблему кроме как писать две перегрузки для каждого stream?
Stream & operator<<(Stream & strm, const CMyClass & val);
std::ostream & operator<<(std::ostream & strm, const CMyClass & val);
Ответы (1 шт):
Сделал так
template <typename T>
T & toStream(T & strm, const CMyClass & val) {
............
return strm;
}
inline Stream & operator<<(Stream & strm, const CMyClass & val) {
return toStream(strm, val);
}
inline std::ostream & operator<<(std::ostream & strm, const CMyClass & val) {
return toStream(strm, val);
}
откомпилировалось