2014-06-11 3 views
3

J'ai le code suivantC++ opérateur << (void *)

#include <iostream> 
#include <sstream> 

class oTraceStream : public std::ostringstream 
{ 
public : 

    oTraceStream(const int from, const unsigned int level) 
    : m_from(from) 
    , m_level(level) 
    { 
    } 

    virtual ~oTraceStream(void) 
    { 
     std::cout << str(); 
    } 

private : 
    // unused for this sample 
    int m_from; 
    unsigned int m_level; 
}; 


int main(int argc, char* argv[]) 
{ 
    oTraceStream(0,0) << "1st part " << " 2nd part" << std::endl; 
    { 
     oTraceStream tmp(0,0); 
     tmp << "1st part " << " 2nd part" << std::endl; 
    } 

    return 0; 
} 

Avec MS Visual 6.0 ou ancien gcc (2.x), les 2 sorties sont les mêmes.

1st part 2nd part 
1st part 2nd part 

Avec MS Visual 2008 ou récente gcc (4.x) la première chaîne de la première ligne est affichée en tant que pointeur

0x80493ec 2nd part 
1st part 2nd part 

que quelqu'un peut me expliquer pourquoi, cinque compilateur récemment la première ligne est affiché en utilisant ostream :: operator < < (const void * p) au lieu de ostream :: operator < < (const char *)?

+0

qu'est-ce que 'str' ??? –

+2

@LuchianGrigore standard 'std :: ostringstream :: str()' – Erbureth

+2

Remarque: Les classes de flux telles que 'ostringstream' ne devraient pas être sous-classées. Seul 'streambuf' devrait. (Bien, vous pouvez faire des sous-classes analogues comme 'ostringstream' correspond à' stringbuf'.) – Potatoswatter

Répondre

4

La surcharge void const * est un membre de std::ostream, tandis que la surcharge char const * est un non-membre. L'objet temporaire oTraceStream(0,0) ne se liera pas à la référence non-const utilisée par le non-membre operator <<, mais il se liera au paramètre implicite this utilisé par le membre. C++ 11 entraîne le comportement à revenir à vos attentes, car il ajoute un operator << qui prend une valeur (par exemple une sous-expression d'objet temporaire) et l'amène à une valeur l (par exemple une sous-expression d'objet nommé).