У меня есть базовый класс Exception, который определяет функцию потока:
class Exception
{
public:
template <typename TData, typename TException>
TException& stream(const TData& data)
{
stream_ << data;
return *reinterpret_cast<TException*>(this);
}
};
У меня есть свободный оператор перегрузки функций <<: </p>
template <typename TData>
Exception& operator<<(Exception& ex, const TData& data) {
return ex.stream<TData, Exception>(data);
}
У меня также есть оператор перегрузки исключений с перегрузкой<<: </p>
template <typename TData>
CoffeeException& operator<<(CoffeeException& ex, const TData& data) {
return ex.stream<TData, CoffeeException>(data);
}
Я использую это так:
else {
throw CoffeeException() << "Exception text";
}
Когда я пытаюсь использовать класс, компилятор не видит функцию, он просто предлагает стандартные операторы потокадоступно, но не замечает мои бесплатные функции Exception или CoffeeException.Эта реализация выглядит правильно?