隐式将lambda转换为boost :: function

时间:2011-09-22 21:36:52

标签: c++ lambda c++11

我正在尝试通过以下代码将隐式lambda转换为lambda函数:

#include <boost/function.hpp>

struct Bla {
};

struct Foo {

boost::function< void(Bla& )> f;

  template <typename FnType>
  Foo( FnType fn) : f(fn) {}

};

#include <iostream>

int main() {

Bla bla;
Foo f( [](Bla& v) -> { std::cout << " inside lambda " << std::endl; } );
};

但是,我用g ++

收到了这个错误
$ g++ --version
g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
$ g++ -std=c++0x test.cpp `pkg-config --cflags boost-1.46` -o xtest `pkg-config --libs boost-1.46` 
test.cpp: In function ‘int main()’:
test.cpp:21: error: expected primary-expression before ‘[’ token
test.cpp:21: error: expected primary-expression before ‘]’ token
test.cpp:21: error: expected primary-expression before ‘&’ token
test.cpp:21: error: ‘v’ was not declared in this scope
test.cpp:21: error: expected unqualified-id before ‘{’ token

任何想法我怎样才能实现上述目标?或者如果我能完成它?


更新尝试使用g ++ 4.5

$ g++-4.5 --version
g++-4.5 (Ubuntu/Linaro 4.5.1-7ubuntu2) 4.5.1
$ g++-4.5 -std=c++0x test.cpp `pkg-config --cflags boost-1.46` -o xtest `pkg-config --libs boost-1.46` 
test.cpp: In function ‘int main()’:
test.cpp:20:22: error: expected type-specifier before ‘{’ token

2 个答案:

答案 0 :(得分:3)

您的lambda语法错误。你有' - &gt;'在那里但没有指定返回类型。你可能意味着:

Foo f( [](Bla& v) { std::cout << " inside lambda " << std::endl; } );

答案 1 :(得分:2)

您错过了void

Foo f( [](Bla& v) -> void { std::cout << " inside lambda " << std::endl; } );
//                   ^ here

或者,正如@ildjarn指出的那样,你可以简单地省略返回类型:

Foo f( [](Bla& v) { std::cout << " inside lambda " << std::endl; } );

使用这两行中的任何一行,您的代码都可以使用MinGW g ++ 4.5.2和Boost v1.46.1进行编译。