Разве я не смогу использовать переменную типа non_blank в любом месте, где бы я использовал std :: string?Разве это не часть оператора приведения?
Не совсем.Если компилятор видит, что вы делаете что-то, что, как он знает, требует std :: string, он может вызвать ваш оператор преобразования, чтобы получить его.Но в случае с оператором ostream << у него нет ни одной конкретной функции для вызова, а довольно много их, все разные, и ни одна из них не соответствует точно реальному типу, который вы хотите напечатать.Таким образом, он перечисляет целую кучу кандидатов, ни один из которых не является достаточно сильным совпадением.Вам нужно определить оператор ostream << для вашего типа, чтобы он печатался так, как должен. </p>
Что касается вашего оператора >>, вы должны сделать его не членом вашего класса.Объявите его как друга в объявлении класса, если нужно, но напишите саму функцию снаружи.