Почему это использование boost :: none не скомпилируется с nvcc? - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь скомпилировать следующий код:

#include <boost/optional.hpp>
void foo(boost::optional<unsigned> x = boost::none);

, помещенный в файл a.cu, с помощью компилятора CUDA, используя следующую командную строку:

nvcc a.cu -c --std=c++11 -I/opt/boost/include

но я получаю кучу ошибок:

a.cu:2:53: error: conversion from ‘const boost::none_t(boost::none_t::init_tag (*)())’ to ‘boost::optional<unsigned int>’ is ambiguous
 void foo(boost::optional<unsigned> x = boost::none);
                                                     ^
/opt/boost/include/boost/optional/optional.hpp:805:1: note: candidate: boost::optional<T>::optional(boost::optional<T>::rval_reference_type) [with T = unsigned int; boost::optional<T>::rval_reference_type = unsigned int&&] <near match>
     optional ( rval_reference_type val ) : base( boost::forward<T>(val) )
 ^   ~~~~
/opt/boost/include/boost/optional/optional.hpp:805:1: note:   conversion of argument 1 would be ill-formed:
a.cu:2:53: error: invalid conversion from ‘const boost::none_t (*)(boost::none_t::init_tag (*)())’ to ‘unsigned int’ [-fpermissive]
 void foo(boost::optional<unsigned> x = boost::none);
                                                     ^
/opt/boost/include/boost/optional/optional.hpp:800:1: note: candidate: boost::optional<T>::optional(boost::optional<T>::argument_type) [with T = unsigned int; boost::optional<T>::argument_type = const unsigned int&] <near match>
     optional ( argument_type val ) : base(val) {}
 ^   ~~~~
/opt/boost/include/boost/optional/optional.hpp:800:1: note:   conversion of argument 1 would be ill-formed:
a.cu:2:53: error: invalid conversion from ‘const boost::none_t (*)(boost::none_t::init_tag (*)())’ to ‘unsigned int’ [-fpermissive]
 void foo(boost::optional<unsigned> x = boost::none);

Почему это происходит, и могу ли я обойти проблему, все еще фактически используя boost :: option в (на стороне хоста) код, скомпилированный с nvcc?

Дополнительная информация:

  • Код прекрасно компилируется с g ++ 6.3.0 (компилятор моего дистрибутива).
  • Этот код (или, скорее, похожий код) использовал для компиляции и работы с более ранним дистрибутивом Linux, который я использовал, где компилятор был g ++ 5.4.x.
  • Я пробовал это с Boost версий 1.65.1 и 1.69.0.
  • Я пробовал это с версиями CUDA 9.2.88 и 10.0.130.

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

У меня была точно такая же ошибка, и я смог заставить ее работать с этой модификацией:

    #define BOOST_OPTIONAL_USE_OLD_DEFINITION_OF_NONE
    #include <boost/optional.hpp>

Это использует CUDA 10.0.130, g ++ 7.3.0 и Boost 1.68.0.

0 голосов
/ 10 февраля 2019

Частичный ответ на второй вопрос:

Вы можете использовать Andrzej Krzemieński аккуратную и автономную реализацию optional вместоboost::optional.Он работает с C ++ 11, что вы, похоже, делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...