Уточнение перегруженного оператора

Есть сторонняя библиотека, в которой определен класс 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 шт):

Автор решения: Anton Shchyrov

Сделал так

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);
}

откомпилировалось

→ Ссылка