Template-Methode aus Template-Methode aufrufen



  • Hi zusammen

    Kurze Frage bezüchglich folgender Template-Methode:

    template<class T, class U>
    std::vector<boost::shared_ptr<T> > DAO::loadByQuery(const std::string &query) throw(DataAccessException) {
        try {
            dba::SQLIStream is = db->getIStream();
            T type;
            is.openFromQuery(type, query.c_str());
            return U::loadFromStream<T>(is);
        } catch(const dba::Exception &ex) {
            throw DataAccessException(ex);
        }
    }
    

    Versuche ich, das zu kompilieren, bekommen ich den folgenden Fehler:

    /home/user/Software/c++/emc/src/main/include/com/emc/persistence/DAO.inc: In member function ‘std::vector<boost::shared_ptr<X>, std::allocator<boost::shared_ptr<X> > > com::emc::persistence::DAO::load()’:
    /home/user/Software/c++/emc/src/main/include/com/emc/persistence/DAO.inc:55: error: expected primary-expression before ‘>’ token
    

    Der Fehler bezieht sich auf die Zeile mit "U::loadFromStream<T>(is)" . Grundsätzlich geht es darum, dass in in der Oberklasse DAO viele Dinge verallgemeinert werden können (wie z.B. loadByQuery), solange diese Methoden auf eine Template-Methode namens loadFromStream der erbenden Unterklasse zugreifen können. LoadFromStream kann dabei zuweilen sehr spezifisch sein und ist je nach Data Access Object (z.B. UserDAO oder ConsumptionDAO) für diverse Entitätsklassen spezialisiert.

    Wären virtuelle Template-Methoden in C++ möglich, hätte ich das selbstverständlich so gelöst. Diese Variante stellt einen kleinen Workaround dar, der nur wenig Zusatzcode verlangen würde - wenn's denn kompilierte 🙂 ...

    Weiss jemand also, wo im obigen Code der Hund begraben ist?

    Thx und greeetz
    Kessi



  • Da U ein template-Parameter ist, ist U::loadFromStream ein abhängiges Template. Genauso wie Du bei abhängigen Typen typename verwenden musst, musst Du den Compiler hier nochmal sagen, dass loadFromStream ein Template ist:

    return U::template loadFromStream<T>(...)
    


  • Schnell, kurz und korrekt! Darum liebe ich euch Leute so 😃 ...

    Danke nochmals und Gruss
    Kessi


Anmelden zum Antworten