Это вопрос к my previous question.Вложенные выражения привязки
#include <functional>
int foo(void) {return 2;}
class bar {
public:
int operator() (void) {return 3;};
int something(int a) {return a;};
};
template <class C> auto func(C&& c) -> decltype(c()) { return c(); }
template <class C> int doit(C&& c) { return c();}
template <class C> void func_wrapper(C&& c) { func(std::bind(doit<C>, std::forward<C>(c))); }
int main(int argc, char* argv[])
{
// call with a function pointer
func(foo);
func_wrapper(foo); // error
// call with a member function
bar b;
func(b);
func_wrapper(b);
// call with a bind expression
func(std::bind(&bar::something, b, 42));
func_wrapper(std::bind(&bar::something, b, 42)); // error
// call with a lambda expression
func([](void)->int {return 42;});
func_wrapper([](void)->int {return 42;});
return 0;
}
Я получаю ошибки компиляции, глубоко в заголовках C++:
functional:1137: error: invalid initialization of reference of type ‘int (&)()’ from expression of type ‘int (*)()’
functional:1137: error: conversion from ‘int’ to non-scalar type ‘std::_Bind<std::_Mem_fn<int (bar::*)(int)>(bar, int)>’ requested
func_wrapper (Foo) предполагается выполнить FUNC (пустяк (Foo)). В реальном коде он упаковывает функцию для выполнения потока. func выполняет функцию, выполняемую другим потоком, doit находится между ними, чтобы проверять необработанные исключения и очищать. Но дополнительная привязка в func_wrapper messes things up ...
возможно удалить тег C++?это прямой C++ 0x – Anycorn
Сохраните оба тега. C++ 0x тоже C++. – jalf
Дайте PC-Lint вихрь (с www.gimpel.com). Это неплохо дает гораздо лучшие и подробные сообщения об ошибках, чем визуальная студия. Однако это довольно дорого. –