Tôi đang cố viết hàm mẫu chấp nhận std::function
phụ thuộc vào đối số mẫu. Thật không may trình biên dịch không có khả năng khử chính xác các đối số cho số std::function
. Dưới đây một số mã ví dụ đơn giản:Chức năng mẫu C++ 11 lấy hàm std :: phụ thuộc vào tham số mẫu
#include <iostream>
#include <functional>
using namespace std;
void DoSomething(unsigned ident, unsigned param)
{
cout << "DoSomething called, ident = " << ident << ", param = " << param << "\n";
}
template < typename Ident, typename Param >
void CallFunc(Ident ident, Param param, std::function< void (Ident, Param) > op)
{
op(ident, param);
}
int main()
{
unsigned id(1);
unsigned param(1);
// The following fails to compile
// CallFunc(id, param, DoSomething);
// this is ok
std::function< void (unsigned, unsigned) > func(DoSomething);
CallFunc(id, param, func);
return 0;
}
Nếu tôi gọi là mẫu như sau:
CallFunc(id, param, DoSomething);
tôi nhận được các lỗi sau đây:
function-tpl.cpp:25: error: no matching function for call to
CallFunc(unsigned int&, unsigned int&, void (&)(unsigned int, unsigned int))
Nếu tôi một cách rõ ràng tạo ra một std :: chức năng của loại chính xác (hoặc bỏ qua) vấn đề biến mất:
std::function< void (unsigned, unsigned) > func(DoSomething);
CallFunc(id, param, func);
Tôi làm cách nào để viết mã này để tạm thời không cần thiết?
Bạn có quên xóa các ký tự nhận xét "//" trước dòng vi phạm không? Tôi có GCC4.6.1 và GCC từ chối nói dòng. –
@litb * D'OH!* Được phát hiện. –