C++ 调用类类型的对象而不使用适当的运算符()

C++ 调用类类型的对象而不使用适当的运算符(),c++,cuda,thrust,C++,Cuda,Thrust,我有下面这个函数来测试推力,但它不编译。看来我的谓词是无效的,而且我对C/C++的知识还不足以知道我需要做什么来纠正编译问题。请有人解释一下这里发生了什么,我怎样才能解决它 void filter(device_vector<int>& x, device_vector<int>& y, thrust::unary_function<int,bool> f) { thr

我有下面这个函数来测试推力,但它不编译。看来我的谓词是无效的,而且我对C/C++的知识还不足以知道我需要做什么来纠正编译问题。请有人解释一下这里发生了什么,我怎样才能解决它

void filter(device_vector<int>& x, 
                device_vector<int>& y,
                thrust::unary_function<int,bool> f) {

    thrust::copy_if(x.begin(), x.end(), y.end(), f);
}


nvcc -o test test.cu -O2
/usr/lib/nvidia-cuda-toolkit/include/thrust/detail/internal_functional.h(102): error: call of an object of a class type without appropriate operator() or conversion functions to pointer-to-function type
          detected during:
            instantiation of "__nv_bool thrust::detail::predicate_to_integral<Predicate, IntegralType>::operator()(const T &) [with Predicate=thrust::unary_function<__nv_bool, int>, IntegralType=std::ptrdiff_t, T=int]" 
/usr/lib/nvidia-cuda-toolkit/include/thrust/detail/function.h(187): here
            instantiation of "Result thrust::detail::host_device_function<Function, Result>::operator()(const Argument &) const [with Function=thrust::detail::predicate_to_integral<thrust::unary_function<__nv_bool, int>, std::ptrdiff_t>, Result=std::ptrdiff_t, Argument=thrust::device_reference<int>]" 
/usr/lib/nvidia-cuda-toolkit/include/thrust/iterator/transform_iterator.h(306): here
            instantiation of "thrust::detail::transform_iterator_base<AdaptableUnaryFunction, Iterator, Reference, Value>::type::reference thrust::transform_iterator<AdaptableUnaryFunction, Iterator, Reference, Value>::dereference() const [with AdaptableUnaryFunction=thrust::detail::predicate_to_integral<thrust::unary_function<__nv_bool, int>, std::ptrdiff_t>, Iterator=thrust::detail::normal_iterator<thrust::device_ptr<int>>, Reference=std::ptrdiff_t, Value=thrust::use_default]" 
/usr/lib/nvidia-cuda-toolkit/include/thrust/iterator/iterator_facade.h(128): here
            instantiation of "Facade::reference thrust::iterator_core_access::dereference(const Facade &) [with Facade=thrust::transform_iterator<thrust::detail::predicate_to_integral<thrust::unary_function<__nv_bool, int>, std::ptrdiff_t>, thrust::detail::normal_iterator<thrust::device_ptr<int>>, std::ptrdiff_t, thrust::use_default>]" 
/usr/lib/nvidia-cuda-toolkit/include/thrust/iterator/iterator_facade.h(305): here
void过滤器(设备向量&x、,
设备_向量&y,
推力:一元函数(f){
推力:如果(x.begin(),x.end(),y.end(),f)复制_;
}
nvcc-o测试。cu-O2
/usr/lib/nvidia cuda toolkit/include/推力/detail/internal_functional.h(102):错误:调用类类型的对象,但没有适当的运算符()或将函数转换为指向函数类型的指针
在以下期间检测到:
实例化“\uuuu nv\ubool-struct::detail::predicate\u to\u integral::operator()(const T&)[带谓词=struct::一元函数,IntegralType=std::ptrdiff\u T,T=int]”
/usr/lib/nvidia-cuda-toolkit/include/推力/detail/function.h(187):这里
实例化“结果推力::细节::主机\设备\函数::运算符()(常量参数&)常量[函数=推力::细节::谓词\到\积分,结果=std::ptrdiff \ t,参数=推力::设备\引用]”
/usr/lib/nvidia-cuda-toolkit/include/推力/iterator/transform_-iterator.h(306):这里
实例化“推力::细节::转换迭代器\u基::类型::引用推力::转换迭代器::取消引用()常量[带AdaptebleUnaryFunction=推力::细节::谓词\u到\u整数,迭代器=推力::细节::普通迭代器,引用=std::ptrdiff\t,值=推力::使用默认值]”
/usr/lib/nvidia-cuda-toolkit/include/推力/iterator/iterator_-facade.h(128):这里
实例化“Facade::reference-struct::iterator\u-core\u-access::dereference(const-Facade&)[带Facade=struct::transform\u-iterator]”
/usr/lib/nvidia-cuda-toolkit/include/推力/iterator/iterator_-facade.h(305):这里

让我们先看一些参考资料:

函数对象pred不得应用任何非常量函数 通过解引用迭代器。此函数对象可以是 指向具有适当类型的函数或对象的指针 函数调用操作符


因此,您不应该将调用者的选择限制为
一元函数
。在这种情况下,应该允许在
copy\u的上下文中使用的任何对象、函数或任何内容(如果
)通过。实际上,在香草C++<代码> unyAyl函数< /C++ >中,(赞成代码> STD::函数,无论如何,这里不应该使用完全相同的原因)。< /P>您的函数与参数具有相同的名称,这可能会让编译器有点困惑。我尝试了你的建议,但它仍然存在同样的编译问题。此外,我会避免在界面中放置
一元函数
,而只将模板放在
f
类型上。这很有效,谢谢。如果你想把它作为你努力的答案,我会接受的。