‘оператор/’ не является членом «std::файловая система»; вы имели в виду » оператор~»

#c #makefile #cmake #std-filesystem

Вопрос:

Я пытаюсь установить MMMTools https://mmm.humanoids.kit.edu/installation.html. Моя версия cmake-3.16.3. Я прошел каждый шаг без каких-либо ошибок до этого раздела

 cd ~/MMMCore
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make   
 

make Команда возвращает мне следующую ошибку.

 (base) kong@kong-Standard:~/MMMCore/build$ make
[  1%] Building CXX object CMakeFiles/MMMCore.dir/MMM/XMLTools.cpp.o
/home/kong/MMMCore/MMM/XMLTools.cpp: In function ‘void MMM::XML::makeAbsolutePath(const stringamp;, std::stringamp;)’:
/home/kong/MMMCore/MMM/XMLTools.cpp:650:64: error: ‘operator/’ is not a member of ‘std::filesystem’; did you mean ‘operator~’?
  650 |   std::filesystem::path filenameNewComplete = std::filesystem::operator/(filenameBasePath, filenameNew);
      |                                                                ^~~~~~~~~
      |                                                                operator~
make[2]: *** [CMakeFiles/MMMCore.dir/build.make:76: CMakeFiles/MMMCore.dir/MMM/XMLTools.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:295: CMakeFiles/MMMCore.dir/all] Error 2
make: *** [Makefile:163: all] Error 2
 

Но я погуглил функцию и увидел, что она является членом файловой системы std::https://en.cppreference.com/w/cpp/filesystem/path/operator_slash. Что пошло не так?

Я просмотрел CMakeLists.txt и увидел это.

 ###########################################################
#### Compiler configuration                            ####
###########################################################

set(CMAKE_POSITION_INDEPENDENT_CODE ON) # enable -fPIC

if(MSVC)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /MP")
elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
    # cmake 3.10 does not understand c  2a, so we tell it we will handle the standard flag
    set(CMAKE_CXX_STANDARD_DEFAULT)
    add_definitions(-std=c  2a)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic")
endif()

add_compile_options(-Werror)
 

Я компилирую его на Ubuntu 20.04, так что, думаю, он входит в раздел elseif. Означает ли это, что он не использует C 17? Нужно ли мне редактировать строку set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic") , чтобы она использовала C 17?

В руководстве указано, что это для 18.04, но поскольку проблема связана с C 17, я не думаю, что ошибка заключается в использовании 20.04?

Комментарии:

1. operator/ является участником std::filesystem с C 17. Какой стандарт указан в файле makefile?

2. @Chris Я обновил свой пост, включив в него раздел из CMakeLists.txt это определяет компилятор. Нужно ли мне менять его на C 17? Я новичок в CMake.

3. Изложение std::filesystem::operator/(filenameBasePath, filenameNew) поражает цель operator/ . Один из них должен использоваться filenameBasePath/filenameNew . Просто говорю.

Ответ №1:

Из-за LWG 3065 оператор теперь скрыт и не должен вызываться напрямую.

 std::filesystem::path filenameNewComplete = std::filesystem::operator/(filenameBasePath, filenameNew);
 

Должно быть просто:

 std::filesystem::path filenameNewComplete = filenameBasePath / filenameNew;
 

Я предполагаю, что код был протестирован только на более старой реализации (похоже, что это было реализовано в gcc/libstdc 9), чем та, которую вы используете, хотя я не знаю, почему изначально он был написан таким сложным способом.

Комментарии:

1. Вы показываете декларацию std::filesystem::operator/ , членом которой явно являетесь std::filesystem . Он возвращает std::filesystem::path , что является типом.

2. @n.1.8e9-где-моя-доля. исправлено