OVH Cloud OVH Cloud

Failed to specialize function template

2 réponses
Avatar
Laurent
Salut,

J'ai écrit un petit programme de test pour vérifier la solution proposée il
y a quelques jours par Falk Tannhäuser concernant l'accès à un membre de
classe grâce au pointeur "Membertype MaClasse::*member_ptr". J'ai essayé de
respecter la syntaxe proposée pour s'adapter au fait que les membres font
partie d'une classe template mais j'ai une erreur de compilation (voir tout
à la fin). J'ai recopié tout mon code qui compile à l'exception de l'appel à
updateParam qui fait une erreur "Failed to specialize...". Une idée pour
faire compiler ça ?

-----------------------------------------
test2.h

// Class genericParam
template <class ParamType>
class genericParam
{
public :
genericParam();
void operator=(const ParamType &right);
const ParamType getValue () const;
void setValue (ParamType value);
ParamType _value;
};

template <typename ParamType>
inline genericParam<ParamType>::genericParam() { }

template <typename ParamType>
inline void genericParam<ParamType>::operator=(const ParamType &right)
{ _value = right; }

template <typename ParamType>
inline const ParamType genericParam<ParamType>::getValue () const
{ return _value; }

template <typename ParamType>
inline void genericParam<ParamType>::setValue (ParamType value)
{
_value = value;
}

// Class SetOfParams
class SetOfParams
{
public :
SetOfParams();
template<typename T>
void updateParam(genericParam<T> SetOfParams::*param_ptr, T const& value);
genericParam<int> _Param1;
genericParam<long> _Param2;
genericParam<float> _Param3;
genericParam<int> _Param4; };


------------------------------------------------------
test2.cpp

#include "stdafx.h"
#include "test2.h"

SetOfParams::SetOfParams() {}

template<typename T>
void SetOfParams::updateParam(genericParam<T> SetOfParams::*member_ptr, T
const& value) {
this->*member_ptr = value; }

int main(int argc, char* argv[]) {
SetOfParams mySetOfParams;
mySetOfParams._Param1.setValue(5);
printf("_Param1 vaut %d\n", mySetOfParams._Param1.getValue());
mySetOfParams._Param1 = 6;
printf("_Param1 vaut %d\n", mySetOfParams._Param1.getValue());

mySetOfParams.updateParam(&SetOfParams::_Param1, 666);

printf("_Param1 vaut %d\n", mySetOfParams._Param1.getValue());
return 0; }


----------------------------------------------------
Compilation

Compiling...
test2.cpp
d:\test_programs\test2\test2.cpp(33) : error C2893: Failed to specialize
function template 'void __thiscall SetOfParams::updateParam(class
genericParam<T> SetOfParams::*,const T &)'
With the following template arguments:
'int'
Error executing cl.exe.

test2.exe - 1 error(s), 0 warning(s)

2 réponses

Avatar
Jean-Sebastien Mouret
"Laurent" writes:

Salut,

J'ai écrit un petit programme de test pour vérifier la solution proposée il
y a quelques jours par Falk Tannhäuser concernant l'accès à un membre de
classe grâce au pointeur "Membertype MaClasse::*member_ptr". J'ai essayé de
respecter la syntaxe proposée pour s'adapter au fait que les membres font
partie d'une classe template mais j'ai une erreur de compilation (voir tout
à la fin). J'ai recopié tout mon code qui compile à l'exception de l'appel à
updateParam qui fait une erreur "Failed to specialize...". Une idée pour
faire compiler ça ?


changer de compilo?
plus sérieusement, ca passe sur gcc et vc7.1


--
js

Avatar
Laurent
Merci pour l'idée qui est effectivement la bonne, en fait il semble que VC++
6 n'aime pas trop les fonctions templates hors de la définition de la
classe. Le simple fait de déplacer la définition de updateParam dans la
définition de class SetOfParams permet de compiler.

C'est cool ça marche et il y a même moyen d'appeler les accesseurs getValue
et setValue sur le membre pointé via this->*member_ptr. Ca me simplifie bien
ce que j'ai à faire !