Problem mit Template-Methode



  • Hallo,

    ich habe in einer Klasse folgende Template-Methoden implementiert...

    Header:

    namespace cutex {
    
    class QxSqlQueryModel : public QAbstractTableModel
    {
    ...
        template<typename T> QList<T> columnValues(int column) const;
        template<typename T> static QList<T> columnValues(const QString &query);
    ...
    

    Quelldatei:

    template<typename T> QList<T> cutex::QxSqlQueryModel::columnValues(int column) const
    {
        QList<T> list;
    
        if (column < columnCount()) {
            for (int n = 0; n < rowCount(); n++)
                list.append(record(n).value(column).value<T>());
        }
    
        return list;
    }
    
    template<typename T> QList<T> cutex::QxSqlQueryModel::columnValues(const QString &query)
    {
        QxSqlQueryModel model;
        QList<T> list;
    
        if (model.setQuery(query))
            list = model.columnValues<T>(0);
    
        return list;
    }
    

    Der Code lässt sich problemlos kompilieren, allerdings handelt es sich dabei um eine statische Library, welche von anderen Projekten verwendet wird. Hier ein kleines Beispiel:

    m_ui.LiefersperreField->addItems(QxSqlQueryModel::columnValues<QString>(
            "SELECT value FROM strings WHERE category = 6"));
    

    Wenn ich mein Projekt bauen will, bekomme ich Linkerfehler:

    Fehler: undefined reference to `QList<QString> cutex::QxSqlQueryModel::columnValues<QString>(QString const&)'

    Das dubiose an der Sache ist, der Fehler tritt nur auf, wenn ich die Library als Release baue, d.h. als Debug-Build funktioniert alles ohne Probleme.

    Als Compiler nutze ich MinGW 5.3.0 (32 bit), in Verbindung mit Qt 5.9.1

    Ich hoffe einer von euch hat eine Idee, vielen Dank



  • Hab es jetzt probehalber einmal unter Linux mit GCC und Qt 5.5.1 getestet, da kann ich es auch als Release problemlos bauen. 😕



  • Template, Header in Quelldatei? Hört sich falsch an. Faustregel: Templates werden im Header definiert.



  • manni66 schrieb:

    Template, Header in Quelldatei? Hört sich falsch an. Faustregel: Templates werden im Header definiert.

    Danke, genau das war mein Problem. Nachdem ich mich mittlerweile auch schlau gemacht habe weshalb im Header, wundert mich nur wieso es z.B. mit GCC funktioniert hat.



  • Kommt halt drauf an, wie du kompilierst. Wenn du die cpp-Datei, in der du das Template zunächst implementiert hattest, im selben Compilevorgang mitkompilierst, dann kann das natürlich schon funktionieren. Du kannst, wenn du das Template in der cpp-Datei haben willst, dort auch das Template mit all den gewünschten Klassen, mit denen es funktionieren soll, explizit instanziieren. Allerdings kannst du das Template dann nur mit eben diesen Typen nutzen. Dazu schreibst du

    template class MeinTemplateTyp<TypMitDemDasTemplateFunktionierenSoll>;
    

    Du kannst auch das Template im Header lassen und trotzdem explizite Template-Instanzen in der cpp-Datei erstellen, z.B. für häufig genutzte Typen.


Anmelden zum Antworten