У меня есть потоковый базовый класс:оператор потока и контроль приоритета преобразования
class Stream
{
virtual Stream& operator<< (float num) = 0;
virtual Stream& operator<< (double num) = 0;
virtual Stream& operator<< (bool val) = 0;
};
И тогда я реализую класс реализации:
class StreamImpl : public Stream
{
Stream& operator<< (float num ) { ... do stuff ... }
Stream& operator<< (double num) { ... do stuff ... }
Stream& operator<< (bool val ) { ... do stuff ... }
};
Тогда для новых классов, которые я создаю мой оператор потока, не являющиеся членами функции:
class Blar { };
Stream& operator<< (Stream& str, const Blar& blar) { ... do stuff ... }
Все работает отлично и денди. Но у меня есть проблема, что в некоторых случаях компилятор не знает, какой оператор потока использовать.
Рассмотрим, когда blár имеет оператор произнесения:
class Blar
{
operator bool() const { return false; }
};
Теперь я пытаюсь использовать поток:
void process(Stream& str)
{
Blar blar;
str << blar;
}
Так вот проблема компилятор не знает, должен ли он бросить blár bool, а затем использовать член Stream или cast str для ввода Stream и использовать оператор потока, не являющийся членом.
Есть ли способ определить приоритеты приведения?
Сделать 'operator bool()' функцией 'явным'. –
Хороший ответ - и это сработает - но в этом случае я все еще хочу, чтобы неявное преобразование работало. Я бы хотел, чтобы это было более низким приоритетом. –
Это должно сработать. Возможно, это проблема с вашим компилятором. Посмотрите, как он работает на http://ideone.com/GoHnd8. Он также работает под cygwin/g ++ 4.9.3. –