Tuesday, 13 March 2018

c++ - template argument deduction/substitution failed, when using std::function and std::bind




I have a compile error when using std::function in a templated member function, the following code is a simple example:



#include 
#include
using std::function;
using std::bind;
using std::shared_ptr;

class Test {

public:
template
void setCallback(function cb);
};

template
void Test::setCallback(function 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;
}


And come with the following compile error:




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




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



testtemplate.cpp:29:92: note: candidate is: testtemplate.cpp:10:7:
note: template void Test::setCallback(std::function)



testtemplate.cpp:10:7: note: template argument

deduction/substitution failed:



testtemplate.cpp:29:92: note: ‘std::_Bind(TestA*, std::_Placeholder<1>,
std::_Placeholder<2>)>’ is not derived from ‘std::function’




I'm using C++11 and g++ 4.7


Answer



To figure out the problem let separate statements:




auto f = bind(&TestA::testa, &testA, _1, _2); // OK
test.setCallback(f); // <<--- Error is here


setCallback needs to know type of T and it can't deduce it from f, so give it a type



test.setCallback(f); // TYPE: int, float, a class, ...

No comments:

Post a Comment

casting - Why wasn&#39;t Tobey Maguire in The Amazing Spider-Man? - Movies &amp; TV

In the Spider-Man franchise, Tobey Maguire is an outstanding performer as a Spider-Man and also reprised his role in the sequels Spider-Man...