[Template] Funktionsvorlage konnte nicht spezialisiert werde



  • Guten Abend,
    gegeben ist folgenden Memberfunktion

    template <typename T> Logging& Logging::operator <<(const T &Event)
    {
        std::fstream File;
        File.open(this->m_pfad.c_str(), std::ios::out | std::ios::app);
        if(File.is_open())
        {
            File << Event;
            File.close();
        }
        return *this;
    }
    

    Ruf ich nun den << operator so auf

    int main()
    {
        Logging log;
        int i=15;
        log << i;
        return 0;
    }
    

    kommt folgende Fehlermeldung

    1>f:\c++ - programme\sonstiges\logging\main.cpp(13) : error C2893: Funktionsvorlage 'class Logging &__thiscall Logging::operator <<(const T &)' konnte nicht spezialisiert werden
            Mit den folgenden Vorlagenargumenten:
            'int'
    1>f:\c++ - programme\sonstiges\logging\main.cpp(13) : error C2676: Binaerer Operator '<<' : 'class Logging' definiert diesen Operator oder eine Konvertierung in einen fuer den vordefinierten Operator geeigneten Typ nicht
    

    Wodrann liegt das ?



  • Hi, das kommt mir irgendwie bekannt vor, da gabs doch schonmal nen Thread von dir 🙂

    In deinem Code ist so kein Problem. Ich denke eher du hast deine Definition deiner Template-Memberfunktion nicht in der selben Datei wie die Klassendefinition.

    Bei Templates kannst du nicht in .h und .cpp trennen. Dh Deklaration und Definition müssen in einer Übersetzungseinheit stehen. ( export beachten wir mal nicht 😉 )

    Packe mal alles in die .h und probiere es nochmal aus ...



  • Die Klassen - und Template-Memberfunktion Definition befinden sich in der selben .h Datei.



  • Hmm, poste mal ein komplett kompilierbares Beispiel. Am besten die komplette .h.
    Da ist nämlich kein Fehler ...



  • //
    //    logging.h
    //
    
    #ifndef __LOGGING__
    #define __LOGGING__
    
    #include <string>
    #include <fstream>
    #include <iostream>
    
    class Logging
    {
        private:
            std::string m_pfad;
        public:
            template<typename T> Logging& operator <<(const T &Event);
            Logging();
            ~Logging();
    };
    #endif
    
    template <typename T> Logging& Logging::operator <<(const T &Event)
    {
        std::fstream File;
        /* Anhängen der Log einträge */
        File.open(this->m_pfad.c_str(), std::ios::out | std::ios::app);
        if(File.is_open())
        {
            File << Event;
            File.close();
        }
        return *this;
    }
    
    //
    //    logging.cpp
    //
    
    #include "logging.h"
    
    Logging::Logging()
    {
        this->m_pfad = "LOG.txt";
        std::fstream File;
        File.open(this->m_pfad.c_str(), std::ios::out);
        if(File.is_open())
        {
            File << "Beginn:\n" <<std::endl;
            File.close();
        }
    }
    
    Logging::~Logging()
    {
    }
    
    //
    // main.cpp
    //
    
    #include <iostream>
    #include "logging.h"
    
    int main()
    {
        Logging log;
        int i=15;
        log << i;
        return 0;
    }
    

    Hier ist das Beispiel, nur wird hier der oben genannte Fehler ausgegeben.



  • Alles sieht gut aus. Mach mal ein "Rebuild all".



  • Danke geht jetzt :p

    komisch also im VS6 kommen die oben genannten Fehler, im VS2005 läuft es ohnen Probleme 😡


  • Mod

    iirc hats vs6 nicht so mit member-templates



  • camper schrieb:

    iirc hats vs6 nicht so mit member-templates

    VC 6 (SP5) unterstützt Membertemplates, deren Definition muss aber innerhalb der Klassendefinition geschehen.


Anmelden zum Antworten