Проблема с выводом в поток. не могу найти ошибку.

день добрый.подскажите, плз, как поправить:
class String {    friend std::ostream &operator<<(std::ostream &s, const String &str);public:   //...private:    //class for storing String-valuesstruct StringValue : public RCObject {        std::ostream &operator<<(std::ostream &s){           s << _data;           return s;        }        char *_data;        //...    };    RCPtr<StringValue> _value;};inline std::ostream &operator<<(std::ostream &s, const String &str) {       s <<  (str._value->_data); //(1)    s << *(str._value); //(2)    return s;}
никак не пойму, почему нельзя заменить строку (1) на строку (2).класс RCPtr - шаблонная обертка, имеющая перегруженные операторы * и -> , следовательно, в строчке:*(str._value) мы через operator * в обертке получаем StringValue& и далее (по идее, но почему-то это не так) должен сработать определенный в классе StringValue operator<<, но нет, что-то не получается.если оставить просто строку (1), то все работает. но мне для понимания хочется разобраться, что сделать, чтобы через строку (2) получилось также вывести в поток str._value->_data...может кто поможет, подскажет? спасибо.
3 ответа

никак не пойму, почему нельзя заменить строку (1) на строку (2).
потому что  при  s << *(str._value); вызывается оператор << класса ostream, а не класса StringValueдля решения замените метод на дружественую функцию как у String   


mes, верно! работает.
class String {        class StringValue;    friend std::ostream &operator<<(std::ostream &s, const StringValue &v);    friend std::ostream &operator<<(std::ostream &s, const String &str);public:   //...private:    //class for storing String-valuesstruct StringValue : public RCObject {       friend std::ostream &operator<<(std::ostream &s, const StringValue &v);        char *_data;        //...    };    RCPtr<StringValue> _value;};inline std::ostream &operator<<(std::ostream &s, const String &str) {    s << *(str._value);    return s;}inline std::ostream &operator<<(std::ostream &s, const String::StringValue &v) {    s << v._data;    return s;}
спасибо большое за помощь!


разместить дружественную функцию для StringValue в классе String и в ней использовать StingValue::оператор<< ()