Bonjour à tous.
Je pense que le titre parle de lui même (), voici donc le code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
#include <vector>
#include <iostream>
 
class Foo{
public:
    template<typename T> static T plop(T val) 
    {
	return val;
    }
 
    template <class T, template <typename,typename=std::allocator<T> > class C> 
    static C<T> plop(const C<T>& val)
    { 
	std::cout<<"template conteneur"<<std::endl;   
	return std::vector<T>(1, val[1]);
    }
 
};
 
 
//Plante
template <class T> std::vector<T> Foo::plop(const std::vector<T>& val) 
{
    return std::vector<T>(1, val[1]);
}
 
template <> int Foo::plop(int val)
{
    return val*10;
}
 
int main(int argc, char const *argv[])
{
 
    std::cout<<Foo::plop(std::vector<std::string>(3,"Hi world"))[0]<<std::endl;
    std::cout<<Foo::plop("hello")<<std::endl;
    std::cout<<Foo::plop(42)<<std::endl;
    return 0;
}
J'ai l'erreur suivante
b.cpp:53: erreur: prototype for ‘std::vector<T, std::allocator<_Tp1> > Foo::plop(const std::vector<T, std::allocator<_Tp1> >&)’ does not match any in class ‘Foo’
b.cpp:47: erreur: candidates are: template<class T, template<class, class> class C> static C<T, std::allocator<_Tp1> > Foo::plop(const C<T, std::allocator<_Tp1> >&)
b.cpp:43: erreur: template<class T> static T Foo::plop(T)
A la vue de la première ligne, j'ai l'impression qu'il prend la ligne qui plante comme la définition d'une nouvelle fonction et non comme la spécialisation d'une fonction déjà existante. Une idée de comment résoudre ca ?

Je souhaiterai garder les fonctions membres templates pour garder la déduction automatique du type (même si on peut contourner ce problème avec une fonction membre libre qui est là la base d'une autre solution)
Merci beaucoup.