2017-06-04 3 views
3

utilisant Visual Studio 2017 et la bibliothèque Thrust, je compilé le programme suivant:inattendue erreur de poussée dans le programme simple,

#include <thrust/iterator/counting_iterator.h> 
#include <thrust/iterator/transform_iterator.h> 

template<int c> 
struct computes_mod 
{ 
    auto operator()(int i) const 
    { 
     return i % c; 
    } 
}; 

int main() 
{ 
    auto ti = thrust::make_transform_iterator(thrust::make_counting_iterator(0), computes_mod<3>{}); 

    return 0; 
} 

Cependant, je reçois les erreurs du compilateur suivantes:

C2027 utilisation undefined type 'thrust :: detail :: result_of_adaptable_function'
C3646 'type': spécificateur de remplacement inconnu
C4430 spécificateur de type manquant - int supposé. Note: C++ ne prend pas en charge par défaut-int

dont les détails sont donnés à titre

1>main.cpp 
1>c:\program files\nvidia gpu computing toolkit\cuda\v8.0\include\thrust\detail\type_traits.h(440): error C2027: use of undefined type 'thrust::detail::result_of_adaptable_function<UnaryFunc (int),void>' 
1>  with 
1>  [ 
1>   UnaryFunc=computes_mod<3> 
1>  ] 
1>c:\program files\nvidia gpu computing toolkit\cuda\v8.0\include\thrust\iterator\detail\transform_iterator.inl(40): note: see declaration of 'thrust::detail::result_of_adaptable_function<UnaryFunc (int),void>' 
1>  with 
1>  [ 
1>   UnaryFunc=computes_mod<3> 
1>  ] 
1>c:\program files\nvidia gpu computing toolkit\cuda\v8.0\include\thrust\iterator\detail\iterator_adaptor_base.h(53): note: see reference to class template instantiation 'thrust::detail::eval_if<true,DefaultNullaryFn,thrust::detail::identity_<System>>' being compiled 
1>  with 
1>  [ 
1>   DefaultNullaryFn=thrust::detail::result_of_adaptable_function<computes_mod<3> (int),void>, 
1>   System=thrust::use_default 
1>  ] 
1>c:\program files\nvidia gpu computing toolkit\cuda\v8.0\include\thrust\iterator\detail\transform_iterator.inl(41): note: see reference to class template instantiation 'thrust::detail::ia_dflt_help<Reference,thrust::detail::result_of_adaptable_function<UnaryFunc (int),void>>' being compiled 
1>  with 
1>  [ 
1>   Reference=thrust::use_default, 
1>   UnaryFunc=computes_mod<3> 
1>  ] 
1>c:\program files\nvidia gpu computing toolkit\cuda\v8.0\include\thrust\iterator\transform_iterator.h(191): note: see reference to class template instantiation 'thrust::detail::transform_iterator_base<AdaptableUnaryFunction,Iterator,Reference,Value>' being compiled 
1>  with 
1>  [ 
1>   AdaptableUnaryFunction=computes_mod<3>, 
1>   Iterator=thrust::counting_iterator<int,thrust::use_default,thrust::use_default,thrust::use_default>, 
1>   Reference=thrust::use_default, 
1>   Value=thrust::use_default 
1>  ] 
1>[my_project]\main.cpp(32): note: see reference to class template instantiation 'thrust::transform_iterator<computes_mod<3>,thrust::counting_iterator<int,thrust::use_default,thrust::use_default,thrust::use_default>,thrust::use_default,thrust::use_default>' being compiled 
1>c:\program files\nvidia gpu computing toolkit\cuda\v8.0\include\thrust\detail\type_traits.h(440): error C3646: 'type': unknown override specifier 
1>c:\program files\nvidia gpu computing toolkit\cuda\v8.0\include\thrust\detail\type_traits.h(440): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 

Je ne sais pas pourquoi le compilateur signale que, le type de poussée est définie ou pourquoi mon code provoque une erreur commencer avec. Cela me ressemble comme une utilisation standard de thrust::make_transform_iterator.

Pourquoi cette erreur est-elle produite et comment puis-je la réparer?

En outre, dans le cas où il est important, je compilé avec les drapeaux

/DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_CPP /std:c++latest 

Nous vous remercions de l'aide!

Mise à jour: le programme de test ci-dessus se compile avec succès en utilisant Clang. Le problème semble donc être lié à VC++ spécifiquement.

Répondre

0

Vous devez inclure un en-tête qui définit le type result_of_adaptable_function

Une ligne comme

#include <thrust/detail/type_traits/result_of_adaptable_function.h> 

devrait faire l'affaire.

Vous avez raté les bons éléments pour le faire fonctionner.

+0

J'ai ajouté l'inclusion que vous avez suggérée mais cela ne change pas les erreurs produites. Je pense que l'autre inclut indirectement les éléments de poussée/détail appropriés. – Grayscale