2016-01-13 4 views
0

код:
ostream оператора << вызова родительского ostream

cout << "11122333" << endl; 

ожидать:
11122333 \ п
результат:
11122333 \ п
Хорошо.
код:

cout.operator<<("11122333"); 
cout.operator<<(endl); 

ожидать:
11122333 \ п
результат:
00B273F8 \ п
(или какой-либо другой адрес, это приведение к void* :()

беда: Хотите написать класс, полученный от ostream

class SomeStream : public ostream 
{ 
    public: 
    explicit SomeStream(streambuf* sb) : ostream(sb) { } 
    template <typename T> SomeStream &operator <<(const T &val) 
    { 
    std::ostream::operator<<(val); //Trouble in there! 
    std::cout << "<<" << " " << typeid(T).name() << " " << val << std::endl; 
    /*some other behavior*/ 
    return *this; 
    } 
    SomeStream &operator <<(ostream& (*val) (ostream&)) 
    { 
    std::ostream::operator<<(val); 
    /*some other behavior*/ 
    return *this; 
    } 
    SomeStream &operator <<(ios_base& (*val) (ios_base&)) 
    { 
    std::ostream::operator<<(val); 
    /*some other behavior*/ 
    return *this; 
    } 
}; 

Когда я вызываю родительский оператор std::ostream::operator<<(val); val cast to void* и не нормально работает. Как это правильно? и почему прямой вызов operator<< для ostream работает не так, как косвенный вызов.

+0

Выход 'оператор <<()' глобальная функция шаблон не является членом 'станд :: ostream'. –

+0

Как насчет '(cout.operator <<) (" 11122333 ");'? –

+1

@ Kilanny - это фактически 'std :: operator << (cout," 11122333 ");'. –

ответ

3

Выход operator << для const char* не является типом ostream. Only those Перегрузки являются функциями-членами, один из них для void*. Есть также non-member overloads.

Существует обходной путь:

template <typename T> SomeStream &operator <<(const T &val) 
    { 
    static_cast<std::ostream&>(*this) << val; //Trouble in there! 
    std::cout << "<<" << " " << typeid(T).name() << " " << val << std::endl; 
    /*some other behavior*/ 
    return *this; 
    } 
+0

только 'статический_cast (* этот) << val;' -> работа. 'static_cast (* this) << val;' -> не работает -> ошибка C2248: 'std :: basic_ostream <_Elem, _Traits> :: basic_ostream': не может получить доступ к закрытому члену, объявленному в классе – Jesus05

+0

@ Jesus05, конечно, извините, просто опечатка. – ForEveR

+0

Большое спасибо за решение. Я счастлив :) – Jesus05

Смежные вопросы