>source

다음 코드를 컴파일하려고합니다 :

#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);

왜 이런 일이 발생하며 실제로 nvcc로 컴파일 된 (호스트 측) 코드에서 boost :: optional을 계속 사용하면서 문제를 피할 수 있습니까?

추가 정보 :

  • 이 코드는 g ++ 6.3.0 (내 배포판 컴파일러)으로 잘 컴파일됩니다.
  • 이 코드 (또는 비슷한 코드)는사용하여 컴파일러가 g ++ 5.4.x 인 초기 Linux 배포판에서 컴파일하고 작동했습니다.
  • 부스트 버전 1.65.1 및 1.69.0으로 시도했습니다.
  • CUDA 버전 9.2.88 및 10.0.130으로 시도했습니다.
  • 답변 # 1

    두 번째 질문에 대한 부분 답변 :

    Andrzej Krzemieński의 깔끔하고 독립적 인 optional 구현을 고려할 수 있습니다.   boost::optional 대신 . 그것은 당신이하고있는 것처럼 보이는 C ++ 11과 함께 작동합니다.

  • 답변 # 2

    정확히 같은 오류가 있었고이 수정으로 작동하도록 할 수있었습니다 :

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

    CUDA 10.0.130, g ++ 7.3.0 및 Boost 1.68.0을 사용하고 있습니다.

  • 이전 python - seaborn의 barplot의 오차 막대에 표준 오차를 어떻게 표시 할 수 있습니까?
  • 다음 google apps script - 루프 내의 setvalue 명령