在g ++ v8.2.0中使用std :: experimental :: optional

时间:2018-10-22 15:23:12

标签: c++ g++ c++17 stdoptional

在C ++ 17中,以前称为std::experimental::optional的现在变成了std::optional

但是某些库(例如libpqxx)尚未更新为删除experimental名称空间。

因此,现在使用g ++ v8.2.0附带的新版本Ubuntu 18.10,尝试编译使用libpqxx的项目会导致如下错误:

/usr/include/pqxx/internal/statement_parameters.hxx:213:13: error: ‘experimental’ in namespace ‘std’ does not name a type
  const std::experimental::optional<Arg> &arg)
             ^~~~~~~~~~~~
/usr/include/pqxx/internal/statement_parameters.hxx:213:35: error: expected unqualified-id before ‘<’ token
  const std::experimental::optional<Arg> &arg)
                                   ^
/usr/include/pqxx/internal/statement_parameters.hxx:213:35: error: expected ‘)’ before ‘<’ token
  const std::experimental::optional<Arg> &arg)
                                   ^
                                   )

是否可以将某种标志传递给g ++,以便它定义旧的experimental名称空间?

这些是Ubuntu 18.10中的相关版本号:

> dpkg -l | egrep "libpqxx|g\+\+"
ii  g++             4:8.2.0-1ubuntu1       amd64        GNU C++ compiler
ii  g++-8           8.2.0-7ubuntu1         amd64        GNU C++ compiler
ii  libpqxx-6.2     6.2.4-4                amd64        C++ library to connect to PostgreSQL
ii  libpqxx-dev     6.2.4-4                amd64        C++ library to connect to PostgreSQL (development files)

1 个答案:

答案 0 :(得分:1)

正如@cpplearner在上面的注释中指出的那样,libpqxx具有一个宏(PQXX_HIDE_EXP_OPTIONAL),您可以在包含pqxx头文件之前对其进行定义。除了解决方案外,它更多是临时性的解决方法,但就我而言,它可以使我克服错误并处理所需的代码。

这是我添加到cmake文件中的定义:

ADD_DEFINITIONS ( -DPQXX_HIDE_EXP_OPTIONAL )