2

曾经被称为std::experimental::optional现在std::optional在 C++17 中被称为的东西。

但是一些库——例如 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 ‘&lt;’ token
  const std::experimental::optional<Arg> &arg)
                                   ^
/usr/include/pqxx/internal/statement_parameters.hxx:213:35: error: expected ‘)’ before ‘&lt;’ 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)
4

1 回答 1

2

正如@cpplearner 在上面的评论中指出的那样,libpqxx 有一个宏 ( PQXX_HIDE_EXP_OPTIONAL),您可以在包含 pqxx 头文件之前定义它。与其说是解决方案,不如说是一种临时的解决方法,但在我的情况下,它让我能够克服错误并处理我需要的代码。

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

ADD_DEFINITIONS ( -DPQXX_HIDE_EXP_OPTIONAL )
于 2018-10-22T21:06:46.817 回答