C++ 将std::variant与gmock 1.8对象一起使用时发生编译错误
让我们使用gmock 1.8编写以下代码:C++ 将std::variant与gmock 1.8对象一起使用时发生编译错误,c++,c++17,googlemock,std-variant,C++,C++17,Googlemock,Std Variant,让我们使用gmock 1.8编写以下代码: #include "gtest/gtest.h" #include "gmock/gmock.h" #include <variant> class Obj { public: MOCK_METHOD0( mock, void() );//<-!!! }; using Variant = std::variant<Obj>; TEST(Test, Test) { Obj obj; Variant
#include "gtest/gtest.h"
#include "gmock/gmock.h"
#include <variant>
class Obj {
public:
MOCK_METHOD0( mock, void() );//<-!!!
};
using Variant = std::variant<Obj>;
TEST(Test, Test) {
Obj obj;
Variant variant = obj;
}
#包括“gtest/gtest.h”
#包括“gmock/gmock.h”
#包括
Obj类{
公众:
MOCK_METHOD0(MOCK,void());//如果展开MOCK_METHOD0
宏,将看到它将以下数据成员插入到类定义中:
class Obj
{
public:
// ...
mutable ::testing::FunctionMocker<void()> gmock0_mock_12;
};
也就是说,FunctionMocker
对象是不可复制的,模拟对象也是不可复制的(它们隐式生成的复制构造函数也会被删除)
这是合理的。一个模拟的副本应该有相同的期望吗?它应该再次检查破坏的期望吗
如果要将模拟放在变体中,可以在适当的位置构建它,方法如下:
std::variant<Obj> variant(std::in_place_type_t<Obj>{});
std::variant variant(std::in_place_type_t{});
或:
std::variant;
变体.emplace();
很好,这很有道理,我的问题现在解决了,非常感谢。您是否知道编译器或其他工具会在错误消息中提到Obj类缺少的副本构造函数?
class Obj
{
public:
// ...
mutable ::testing::FunctionMocker<void()> gmock0_mock_12;
};
// There is no generally useful and implementable semantics of
// copying a mock object, so copying a mock is usually a user error.
// Thus we disallow copying function mockers. If the user really
// wants to copy a mock object, they should implement their own copy
// operation, for example:
//
// class MockFoo : public Foo {
// public:
// // Defines a copy constructor explicitly.
// MockFoo(const MockFoo& src) {}
// ...
// };
FunctionMocker(const FunctionMocker&) = delete;
FunctionMocker& operator=(const FunctionMocker&) = delete;
std::variant<Obj> variant(std::in_place_type_t<Obj>{});
std::variant<Obj> variant;
variant.emplace<Obj>();