'operator/' 不是 '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 string&, std::string&)’:
/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::filesystem 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?

由于LWG 3065,操作符现在是隐藏的,不应该直接调用

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

应该是:

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

我猜代码只针对较旧的实现进行了测试(看起来这是在gcc/libstdc++ 9中实现的),而不是您正在使用的那个,我不知道为什么它最初是以如此复杂的方式编写的。

最新更新