web-dev-qa-db-fra.com

Instanciation de la fonction membre du modèle

Dans Class.h:

class Class {
public:
    template <typename T> void function(T value);
};

Dans Class.cpp:

template<typename T> void Class::function(T value) {
    // do sth
}

Dans main.cpp:

#include "Class.h"

int main(int argc, char ** argv) {
    Class a;
    a.function(1);
    return 0;
}

J'obtiens une erreur liée car Class.cpp N'instancie jamais void Class::function<int>(T). Vous pouvez instancier explicitement une classe de modèle avec:

template class std::vector<int>;

Comment instancier explicitement un membre modèle d'une classe non modèle?

Merci,

33
TiMoch

Vous pouvez utiliser la syntaxe suivante dans Class.cpp:

template void Class::function(int);

L'argument modèle peut être omis en raison de la déduction de type, qui fonctionne pour les modèles de fonction. Ainsi, ce qui précède est équivalent à ce qui suit, juste plus concis:

template void Class::function<int>(int);

Notez qu'il n'est pas nécessaire de spécifier les noms des paramètres de fonction - ils ne font pas partie de la signature d'une fonction (ou d'un modèle de fonction).

49
Andy Prowl

Avez-vous essayé ce qui suit dans Class.cpp?

template void Class::function<int>(int value);
6
Didier Trosset