GMOCKing 接口时 std::any 的不完整类型

Posted

技术标签:

【中文标题】GMOCKing 接口时 std::any 的不完整类型【英文标题】:incomplete type for std::any when GMOCKing interface 【发布时间】:2019-08-02 20:16:56 【问题描述】:

我对这个 sn-p 有一个非常奇怪的编译问题:

#include <any>
#include <gmock/gmock.h>


struct Class

    virtual std::any get(int, int) = 0;
;


struct MockClass: Class

    MOCK_METHOD2(get, std::any(int, int));
;


int foo()

    MockClass dd;

错误 gcc 9.1.0:

/usr/include/c++/9.1.0/type_traits:131:12: error: incomplete type ‘std::is_copy_constructible<testing::internal::ReferenceOrValueWrapper<std::any> >’ used in nested name specifier

clang 8.0.0:

/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/type_traits:132:31: error: no member named 'value' in 'std::is_copy_constructible<testing::internal::ReferenceOrValueWrapper<std::any> >'

如果我将 std::any 替换为 std::string 或任何其他常见类型,代码会编译。

【问题讨论】:

【参考方案1】:

这是 libstdc++ 错误90415。

我不确定导致此问题的 std::any 是什么。请注意,您的示例在使用 libstdc++ 时会失败,但在使用 libc++ 时会成功。

【讨论】:

【参考方案2】:

关于此问题的其他信息,我有一个解决方法,可以在 gcc 9.1.0 中将 any 与 gmock 一起使用,使用 std::experimental::fundamentals_v1::any 而不是 std::any,它工作正常。

【讨论】:

以上是关于GMOCKing 接口时 std::any 的不完整类型的主要内容,如果未能解决你的问题,请参考以下文章

获取 std::any 的大小

`std::any_cast` 返回一个副本

是否可以仅从 std::any 使用 std::reference_wrapper 创建 std::any?

带有 std::any 和 std::optional 的 any_cast

`boost::any` 和 `std::any` 之间的区别

为啥在 dlopen'd 函数中传递的 std::any 的 std::any_cast 会引发错误