std::function 参数不允许为不完整类型

问题描述 投票:0回答:2

我正在尝试将 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>
。我尝试了类型命名和类型定义参数:

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

进行编译
c++ c++11 lambda
2个回答
8
投票

您使用了错误的语法。

尝试

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.

0
投票

std::function(推力::device_vector&) f;

我理解上面的语法 void() 为我修复了,你错过了 ()。

© www.soinside.com 2019 - 2024. All rights reserved.