将 std::ref() 与 nvcc 一起使用时,类没有成员“second_argument_type”[重复]
Posted
技术标签:
【中文标题】将 std::ref() 与 nvcc 一起使用时,类没有成员“second_argument_type”[重复]【英文标题】:class has no member "second_argument_type" when using std::ref() with nvcc [duplicate] 【发布时间】:2016-07-22 09:36:10 【问题描述】:我正在尝试使用 cuda 7.5.18 和 gcc 5.4.0 编译带有 nvcc
的 c++
文件,但遇到了错误。举个简单的例子:
#include <thrust/functional.h>
struct test_struct
//..
void f(test_struct& a)
//..
int main()
test_struct a;
std::function<void()> bound_f = std::bind(f, std::ref(a));
使用nvcc -c -std=c++11 test.cu -o test.o
编译此代码会导致以下错误输出:
/usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include/c++/functional(78): error: class "test_struct" has no member "result_type"
detected during:
instantiation of class "std::_Maybe_get_result_type<_Functor, void> [with _Functor=test_struct]"
(86): here
instantiation of class "std::_Weak_result_type_impl<_Functor> [with _Functor=test_struct]"
(184): here
instantiation of class "std::_Weak_result_type<_Functor> [with _Functor=test_struct]"
(264): here
instantiation of class "std::_Reference_wrapper_base_impl<true, true, _Tp> [with _Tp=test_struct]"
(283): here
instantiation of class "std::_Reference_wrapper_base<_Tp> [with _Tp=test_struct]"
(399): here
instantiation of class "std::reference_wrapper<_Tp> [with _Tp=test_struct]"
test.cu(14): here
/usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include/c++/functional(266): error: class "test_struct" has no member "argument_type"
detected during:
instantiation of class "std::_Reference_wrapper_base_impl<true, true, _Tp> [with _Tp=test_struct]"
(283): here
instantiation of class "std::_Reference_wrapper_base<_Tp> [with _Tp=test_struct]"
(399): here
instantiation of class "std::reference_wrapper<_Tp> [with _Tp=test_struct]"
test.cu(14): here
/usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include/c++/functional(267): error: class "test_struct" has no member "first_argument_type"
detected during:
instantiation of class "std::_Reference_wrapper_base_impl<true, true, _Tp> [with _Tp=test_struct]"
(283): here
instantiation of class "std::_Reference_wrapper_base<_Tp> [with _Tp=test_struct]"
(399): here
instantiation of class "std::reference_wrapper<_Tp> [with _Tp=test_struct]"
test.cu(14): here
/usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include/c++/functional(268): error: class "test_struct" has no member "second_argument_type"
detected during:
instantiation of class "std::_Reference_wrapper_base_impl<true, true, _Tp> [with _Tp=test_struct]"
(283): here
instantiation of class "std::_Reference_wrapper_base<_Tp> [with _Tp=test_struct]"
(399): here
instantiation of class "std::reference_wrapper<_Tp> [with _Tp=test_struct]"
test.cu(14): here
5 errors detected in the compilation of "/tmp/tmpxft_00003b29_00000000-7_test.cpp1.ii".
我找不到与error: ... has no member "second_argument_type"
等行相关的任何 nvcc,所以我完全一无所知。显然std::function
的班级成员不知何故找不到(请参阅here)。
我可以做些什么来解决这个问题?
【问题讨论】:
您的代码没有多大意义。如果您使用的是function
和 C++ 标准库中的朋友,为什么在任何地方都没有 #include <functional>
?你为什么要导入thrust::functional
?两者不可互换......
错误原因尚不清楚,但您可以使用 lambda 轻松解决:
std::function<void()> bound_f = [&a]() return f(a); ;
【讨论】:
不幸的是,当我尝试编译一个我无法轻易更改的大项目时出现上述错误。以上是关于将 std::ref() 与 nvcc 一起使用时,类没有成员“second_argument_type”[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何将 cuda-gdb 与使用 nvcc 编译的静态库的 g++ 链接程序一起使用?