2014-01-27 70 views
1

我有以下函数来测试推力,但它不能编译。看起来我的谓词是无效的,而且我对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 
+0

您的函数与参数名称相同,可能会让编译器感到困惑。 –

+0

我试过你的建议,但它仍然有相同的编译问题。 – jimjampez

+0

另外我会避免把'unary_function'放在界面上,而只是在'f'类型上加上模板。 –

回答

1

让我们来看看一些参考第一:

对象预解码的功能,不通过iterator的反引用应用任何非恒定的功能 。该函数对象可以是指向函数的指针或具有适当的 函数调用操作符的类型的对象。

"Predicate"

因此,您不应该将来电者的选择限制为unary_function。在这种情况下,任何对象,函数,可以在copy_if的上下文中使用的任何对象都应该被允许通过。其实,在香草C++ unary_function已被弃用(赞成std::function,由于完全相同的原因,不应该在这里使用它)。

相关问题