Tôi đang gặp khó khăn trong việc phát hiện tại sao heck này không biên dịch. Tôi đã có một số hàm lambda trả về một số std::function
dựa trên một số đối số.std :: ràng buộc một hàm ràng buộc
tôi đã thu hẹp xuống vấn đề của tôi đến đoạn này (mà không sử dụng lambdas, nhưng tái tạo lỗi của tôi một cách hoàn hảo):
#include <functional>
#include <iostream>
struct foo {
template<class T>
void bar(T data) {
std::cout << data << "\n";
}
};
void some_fun(const std::function<void(int)> &f) {
f(12);
}
int main() {
foo x;
auto f = std::bind(&foo::bar<int>, x, std::placeholders::_1);
auto w = std::bind(some_fun, f);
w();
}
Các cuộc gọi đến w()
sản xuất một trong những kết quả đầu ra lỗi gcc đáng yêu trong đó Tôi không thể hiểu được chuyện gì đang xảy ra. Đây là lỗi lặp lại bởi gcc 4.6.1:
g++ -std=c++0x test.cpp -o test
test.cpp: In function ‘int main()’:
test.cpp:20:7: error: no match for call to ‘(std::_Bind<void (*(std::_Bind<std::_Mem_fn<void (foo::*)(int)>(foo, std::_Placeholder<1>)>))(const std::function<void(int)>&)>)()’
/usr/include/c++/4.6/functional:1130:11: note: candidates are:
/usr/include/c++/4.6/functional:1201:2: note: template<class ... _Args, class _Result> _Result std::_Bind<_Functor(_Bound_args ...)>::operator()(_Args&& ...) [with _Args = {_Args ...}, _Result = _Result, _Functor = void (*)(const std::function<void(int)>&), _Bound_args = {std::_Bind<std::_Mem_fn<void (foo::*)(int)>(foo, std::_Placeholder<1>)>}]
/usr/include/c++/4.6/functional:1215:2: note: template<class ... _Args, class _Result> _Result std::_Bind<_Functor(_Bound_args ...)>::operator()(_Args&& ...) const [with _Args = {_Args ...}, _Result = _Result, _Functor = void (*)(const std::function<void(int)>&), _Bound_args = {std::_Bind<std::_Mem_fn<void (foo::*)(int)>(foo, std::_Placeholder<1>)>}]
/usr/include/c++/4.6/functional:1229:2: note: template<class ... _Args, class _Result> _Result std::_Bind<_Functor(_Bound_args ...)>::operator()(_Args&& ...) volatile [with _Args = {_Args ...}, _Result = _Result, _Functor = void (*)(const std::function<void(int)>&), _Bound_args = {std::_Bind<std::_Mem_fn<void (foo::*)(int)>(foo, std::_Placeholder<1>)>}]
/usr/include/c++/4.6/functional:1243:2: note: template<class ... _Args, class _Result> _Result std::_Bind<_Functor(_Bound_args ...)>::operator()(_Args&& ...) const volatile [with _Args = {_Args ...}, _Result = _Result, _Functor = void (*)(const std::function<void(int)>&), _Bound_args = {std::_Bind<std::_Mem_fn<void (foo::*)(int)>(foo, std::_Placeholder<1>)>}]
Ở đây, f
nên có một số đối tượng có thể được gọi mà phải mất một int như là đối số và gọi sử dụng nó. Mặt khác, w
chỉ là một đối tượng có thể gọi được gọi là some_fun(f)
, là f
đối tượng có thể gọi được đề cập ở trên, có ký hiệu được mong đợi bởi tham số some_fun
.
Tôi có thiếu gì đó không? Tôi có thể không biết cách trộnvà std::function
.
Dường như nó hoạt động khi bạn thay thế tự động bằng 'std :: function' cho f. –
Lalaland
Đây có thể không phải là câu trả lời cho vấn đề của bạn .. nhưng bạn đã cân nhắc việc sử dụng hàm lambda gốc đi kèm với C++ 11 (làm cho std :: bind không cần thiết)? – coldfix
Trong Tăng cường, chúng tôi có 'bảo vệ' cho các trường hợp như thế này, nhưng nó dường như không làm cho nó đạt tiêu chuẩn. –