y****n 发帖数: 15 | 1 请大牛们帮忙看看这段代码,在编译的时候会有如下error message 请问如何能编译通
过啊?跪谢!
当然这只是个虚构的例子,主要是想在template存在的情况下,传递一个member
function的指针给另一个member function.
test1.cpp: In member function 'void Foo::testInt()':
test1.cpp:30:61: error: no matching function for call to 'Foo::processVector
(std::vector&, std::_Bind_helper
std::_Placeholder<1>&>::type)'
processVector(arr, std::bind(&Foo::print, this, _1));
^
test1.cpp:21:8: note: candidate: template void Foo::processVector(
const std::vector&, std::function)
void processVector(const vector& vec, function fun) {
^
test1.cpp:21:8: note: template argument deduction/substitution failed:
test1.cpp:30:61: note: 'std::_Bind(Foo*,
std::_Placeholder<1>)>' is not derived from 'std::function'
processVector(arr, std::bind(&Foo::print, this, _1));
------------------------------------
class Foo {
public:
template
void print(T val) {
cout << val << endl;
}
template
void processVector(const vector& vec, function fun) {
for (auto it=vec.begin(); it != vec.end(); ++it) {
fun(*it);
}
}
void testInt() {
int samples[] = {1,2,3};
vector arr(samples, samples+3);
processVector(arr, std::bind(&Foo::print, this, _1));
}
void testDouble() {
double samples[] = {0.1, 0.2, 0.3};
vector arr(samples, samples+3);
processVector(arr, std::bind(&Foo::print, this, _1));
}
}; | p***o 发帖数: 1252 | 2 不用写那么具体, 这样就好。
template
void processVector(const V &vec, F fun) {
}
processVector
const
【在 y****n 的大作中提到】 : 请大牛们帮忙看看这段代码,在编译的时候会有如下error message 请问如何能编译通 : 过啊?跪谢! : 当然这只是个虚构的例子,主要是想在template存在的情况下,传递一个member : function的指针给另一个member function. : test1.cpp: In member function 'void Foo::testInt()': : test1.cpp:30:61: error: no matching function for call to 'Foo::processVector : (std::vector&, std::_Bind_helper: std::_Placeholder<1>&>::type)' : processVector(arr, std::bind(&Foo::print, this, _1)); : ^
| d****l 发帖数: 51 | 3 根据编译的错误信息,processVector()的第二个变量被定义为std::function
>,而在调用时传入的是std::_Bind_helper
const std::_Placeholder<1>&>::type),编译器无法确定这二者是同一类型,因此报
错。你可以定义一个std::function变量然后把bind赋值给它(implicit
cast)之后在调用processVector时传入这个变量,或者直接static_cast (the
following code uses static_cast and works fine on my machine with gcc-4.8.0):
...
void testint()
{
...
processVector(arr, static_cast>(std::bind(&Foo::
print, this, _1)));
}
...
另外,二楼建议的写法更简洁一些. |
|