До сих пор я использовал 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»?