2009-03-02 9 views
2

Bit eines Gedankenexperiment vergangen ... Ingredient 1: eine Klasse in einer (vorkompilierte) gemeinsam benutzte Bibliothek, die eine Funktion hat, die einen Zeiger auf ein Objekt benötigt, um von Ostream abgeleitet:Template Funktion gemeinsam benutzte Bibliothek (C++)

void ClassName::SetDefaultStream(std::ostream *stream) 

Ingredient 2:

Meine eigene Klasse ZUSAMMENHANG std :: ostream, mit einigen generic Templat Strom Betreiber:

class MyStream : public std::ostream 
{ 
    public: 
     template <typename T> MyStream &operator<<(const T &data) 
     { 
     std::cout << data; 
     return *this; 
     } 
} 

Nun, wenn ich übergeben Sie die Adresse eines instantiati einer dieser Klasse in der SetDefaultStream-Methode, was wird passieren? Zur Kompilierzeit hat der Compiler keine Ahnung, welche Typen auf den Stream in der Shared-Klasse angewendet werden, also wird sicher kein Code synthetisiert? Kann es nicht kompiliert werden, wird es kompiliert und stürzt beim Ausführen ab, kommt Rauch aus dem Computer?

Antwort

6

Ihr Template-Member ist in der Bibliothek nicht sichtbar, da es kein virtuelles Mitglied der Basis std :: ostream ist. Es werden keine Probleme auftreten.

3

Es wird kompiliert, aber Ihr Operator wird nicht aufgerufen.