gpt4 book ai didi

c++ - 在没有适当的 operator() 的情况下调用类类型的对象

转载 作者:太空宇宙 更新时间:2023-11-04 11:41:07 26 4
gpt4 key购买 nike

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

最佳答案

让我们先看一些引用资料:

The function object pred shall not apply any non-constant function through the dereferenced iterator. This function object may be a pointer to function or an object of a type with an appropriate function call operator.

来自 "Predicate" .

因此,您不应将调用者的选择限制为 unary_function。在这种情况下,任何对象、函数,以及任何可以在 copy_if 上下文中使用的东西都应该被允许通过。实际上,在 vanilla C++ 中,unary_function 已被弃用(支持 std::function,出于完全相同的原因无论如何不应在此处使用)。

关于c++ - 在没有适当的 operator() 的情况下调用类类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21387201/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com