2014-01-27 2 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

Давайте посмотрим на некоторых ссылках первый:

Функция объект не пред применяется какой-либо непостоянная функции через разыменованный итератор. Этот функциональный объект может быть указателем на функцию или объект типа с соответствующим оператором вызова функции .

От "Predicate".

Таким образом, вы не должны ограничивать выбор вызывающего абонента unary_function. В таком случае должен быть разрешен любой объект, функция, все, что может использоваться в контексте copy_if. На самом деле, в ваниле C++ unary_function устарел (в пользу std::function, который не должен использоваться здесь в любом случае по тем же причинам).