argument de modèle de déduction ou de substitution d'échec, lors de l'utilisation de std::function et std::bind

J'ai une erreur de compilation lors de l'utilisation de std::function dans basé sur un modèle de fonction de membre de, le code suivant est un exemple simple:

#include <functional>
#include <memory>
using std::function;
using std::bind;
using std::shared_ptr;

class Test {
public:
     template <typename T>
     void setCallback(function<void (T, int)> cb); 
};

template <typename T>
void Test::setCallback(function<void (T, int)> cb)
{
    //do nothing
}

class TestA {
public:
    void testa(int a, int b) {   }
};


int main()
{
    TestA testA;
    Test test;
    test.setCallback(bind(&TestA::testa, &testA, std::placeholders::_1, std::placeholders::_2));
    return 0;
}

Et venir avec l'erreur de compilation suivante:

testtemplate.cpp: In function ‘int main()’:

testtemplate.rpc:29:92: error: no matching function for call pour
"Test::setCallback(std::_Bind_helper)(int, int),
TestA, const std::_Placeholder<1>&, const
std::_Placeholder<2>&>::type)’

testtemplate.rpc:29:92: remarque: le candidat est: testtemplate.rpc:10:7:
note: template void Test::setCallback(std::function)

testtemplate.rpc:10:7: remarque: l'argument de modèle
déduction ou de substitution d'échec:

testtemplate.rpc:29:92: note: ‘std::_Bind(TestA*, std::_Placeholder<1>,
std::_Placeholder<2>)> "n'est pas dérivé de" std::function’

Je suis à l'aide de C++11 et g++ 4.7

  • Dire test.setCallback<int>(bind...). Le résultat de bind n'est pas un std::function, donc il n'y a pas d'argument à déduction.
  • S'il vous plaît dites-moi comment vous pensez que le compilateur pourrait éventuellement comprendre ce qu'il faut en déduire T pour.
  • Je suis un étudiant de première année de modèle, je ne sais pas comment le dedece T de travail.certaines matières de l'aide?
  • En général, lorsque std::function est un paramètre, vous devez préciser le type pleinement à moins que vous passiez un std::function.
InformationsquelleAutor haipeng31 | 2013-03-21