clang версии 6.0.0: clang ++ "нет члена с именем 'make_optional' в пространстве имен 'std'" - PullRequest
0 голосов
/ 11 июня 2018

До сих пор я использовал gcc для компиляции своего кода C ++ в серверной версии Ubuntu 16.04.Но так как последние возможности gcc не представлены в последних возможностях C ++ 17 (главным образом, параллелизм и параллелизм), в то время как в clang многие из них, я начал использовать clang.Что меня удивило, так это то, что для одного из ранее отлаженных gcc файлов C ++ при компиляции с gcc: gcc версии 7.3.0 (Ubuntu 7.3.0-21ubuntu1 ~ 16.04) выполнение идет нормально, если компилируется clang: clang версии 6.0.0 (tags / RELEASE_600 / final), компиляция сообщает об ошибке: нет элемента с именем 'make_optional' в пространстве имен 'std':

`marco@PC:~/marcoTensor$ g++ -std=c++17 bigMatricesDiv01.cpp
-obigMatricesDiv01
 marco@PC:~/marcoTensor$ ./bigMatricesDiv01
 Timer MTensor::Tensor2D A = randU2<double>(20,400,2.7,4.6) :  154 ms
 Timer MTensor::Tensor2D B = randN2<double>(20,400,3,2.6)  :111 ms
 Timer MTensor::Tensor2D ApB = A/B  :0 ms

  marco@PC:~/marcoTensor$ clang++ -std=c++17 -stdlib=libc++ -w -fcolor-
  diagnostics bigMatricesDiv01.cpp -obigMatricesDiv01 -lc++experimental
  In file included from bigMatricesDiv01.cpp:1:
  In file included from ./tensorTypes.h:1:
  In file included from ./MTensorUtils.h:1:
  In file included from ./MTensor.h:5:
  In file included from ./GeneralUtils.h:16:
  ./FunctionalApproach.h:953:27: error: no template named 'optional' in 
  namespace 'std'
  auto transform(const std::optional<T1>& opt, F f) -> 
  decltype(std::make_optional(f(opt.value()))){
                       ~~~~~^
./FunctionalApproach.h:953:68: error: no member named 'make_optional' in 
namespace 'std'
auto transform(const std::optional<T1>& opt, F f) ->   
decltype(std::make_optional(f(opt.value()))){
                                                          ~~~~~^
./FunctionalApproach.h:955:17: error: no member named 'make_optional' in  
namespace 'std'
return std::make_optional(f(opt.value()));
           ~~~~~^
3 errors generated.

`Но: в FunctionalApproach.h:

#include <experimental/propagate_const>

#include <experimental/optional>

Есть идеи, почему clang говорит: «нет члена с именем make_optional в пространстве имен std»?

1 Ответ

0 голосов
/ 11 июня 2018

<experimental/optional> помещает вещи в пространство имен std::experimental.Так вот где живет make_optional.Использование -lc++experimental не означает, что содержимое std::experimental сбрасывается в пространство имен std.

...