Bonjour a tous.

Les exemples et tutoriaux que j'ai pu voir ne sont pas suffisament explicites sur la specialisation d'une fonction template (definition et utilisation). Un ancien fil m'a apporte un debut de reponse mais j'aimerais clarifier quelques points grace a vous.

Si je mets ceci dans un .h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
// Template de base
template <typename InputIt> 
void print(InputIt first, InputIt last) {
    std::cout << "Generic" << std::endl;
}
 
// Template explicite pour les std::vector<double>
// Pas de spacialisation partielle possible pour les function template
template <> 
void print<std::vector<double>::iterator>(std::vector<double>::iterator first, std::vector<double>::iterator last) {
    std::cout << "Size: " << last - first << std::endl;
}
J'obtiens sous VC++ error LNK2005 (already defined) et fatal error LNK1169: one or more multiply defined symbols found

Trois solutions marchent a priori (meme si dans les exemples que j'ai pu voir par ailleurs, ils utilisent cette forme sans aucun avertissement).

1- Rajouter inline ..
2- Separer dans le .cc la definition qui ne doit plus contenir le mot-cle template
3- Declarer et definir une fonction non template.

Qu'est-ce qui se passe exactement ? La specialisation totale ne sert donc a rien ??? D'ailleurs, bizarrement, si je mets en meme temps les declarations suivantes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
template <> 
void print<std::vector<double>::iterator>(std::vector<double>::iterator first, std::vector<double>::iterator last);
void print(std::vector<double>::iterator first, std::vector<double>::iterator last);
aucune complainte du compilateur !

Autre chose. Au depart, je voulais mettre const_iterator pour la version specialisee. Sauf que cela prend tout le temps en compte la version de base pour un appel du style
Code : Sélectionner tout - Visualiser dans une fenêtre à part
print(v.begin(), v.end());
- Pourquoi est-ce la version iterator de begin() qui est utilisee ?
- Comment aussi signifier au niveau de la declaration template qu'on n'accepte que les const iterators ?