我正在尝试将lambda分配给std::function
,如下所示:
std::function<void>(thrust::device_vector<float>&) f;
f = [](thrust::device_vector<float> & veh)->void
{
thrust::transform( veh.begin(), veh.end(), veh.begin(), tanh_f() );
};
我收到错误:
error: incomplete type is not allowed
error: type name is not allowed
我认为它指的是thrust::device_vector<float>
。我尝试了typenaming和typedefining参数:
typedef typename thrust::device_vector<float> vector;
std::function<void>(vector&) f;
f = [](vector & veh)->void
{
thrust::transform( veh.begin(), veh.end(), veh.begin(), tanh_f() );
};
无济于事。但是,如果我只使用lambda(没有std::function
)它可以工作:
typedef typename thrust::device_vector<float> vector;
auto f = [](vector & veh)->void
{
thrust::transform( veh.begin(), veh.end(), veh.begin(), tanh_f() );
};
我错过了什么?
PS:我正在使用nvcc release 6.5, V6.5.12
和g++ (Debian 4.8.4-1) 4.8.4
答案 0 :(得分:6)
您使用的语法错误。
尝试使用std::function<void(thrust::device_vector<float>&)> f;
std::function<void(thrust::device_vector<float>&)> f;
声明一个类型为std::function<void(thrust::device_vector<float>&)>
的变量,它是一个带thrust::device_vector<float>&
并返回void
的函数对象
g ++为您提供了不完整的类型错误,因为std::function<void>
不是有效的模板实例化。
clang ++会给你一个更好的错误信息,告诉你std::function<void>() f;
是一个无效的变量声明:
main.cpp:11:28: error: expected '(' for function-style cast or type construction
std::function<void>(int) f;
~~~^
1 error generated.