2

Je fais une enveloppe de pointeur de méthode comme ceci:pointeur de méthode Templated - ne peut pas correspondre pointeur pour argument de la fonction

template<typename OBJECT, typename... ARGS> 
method_wrapper<ARGS...> _getWrapper(OBJECT* object, void (OBJECT::*method)(ARGS...)) 
{ 
    //irrelevant 
} 

Le problème est juste à l'appel de _getWrapper:

class TestClass 
{ 

    void TestMethod(int a, float b, bool c) 
    { 
     std::cout<<a<<std::endl; 
     std::cout<<b<<std::endl; 
     std::cout<<c<<std::endl; 
    } 
}; 

int main() 
{ 
TestClass testObj; 

method_wrapper<int, float, bool> wrap = _getWrapper<int, float, bool>(&testObj, TestClass::TestMethod); 

wrap.callInternal(1000, 3.14, true); 

//... 

system("pause"); 

return 0; 
} 

Non importe de quelle manière j'essaie de passer les arguments dans _getWrapper, il me dit encore:

aucune instance de la fonction surchargée correspond à la liste des arguments

Does not OBJECT::*method match de TestClass::TestMethod directement? J'ai également essayé &TestClass::TestMethod, ne correspond pas non plus.

Répondre

3

Vous spécifiez explicitement les arguments de modèle lors de l'appel _getWrapper, et le premier est spécifié comme int pour le paramètre de modèle OBJECT, ce qui est incorrect. Parce que les pointeurs membres ne peuvent pas faire référence à un type non-classe.

changement

_getWrapper<int, float, bool>(&testObj, TestClass::TestMethod) 

à

_getWrapper<TestClass, int, float, bool>(&testObj, &TestClass::TestMethod) 
//   ~~~~~~~~~~ 

Notez que vous pouvez simplement compter sur template type deduction, par exemple

_getWrapper(&testObj, &TestClass::TestMethod) 

BTW: Pour prendre l'adresse des membres, vous devriez toujours utiliser & pour elle.
BTW: Je suppose que TestClass::TestMethod est public.

+0

Oui, ça l'a corrigé, merci –