模板化模拟类中缺少MOCK_METHODx() 定义'typename'
'typename' missing for MOCK_METHODx() definitions in templated mock class
我有一个编译器错误问题,gmock和一个模板化的模拟类应该被用作派生(具体)模拟类的基。
目的是测试框架支持的回调方法,但框架基类依赖于最终实现(简而言之,它是一个注入静态接口声明的CRTP模式风格框架)-
我正试图勾勒出我所拥有的(请不要在第一次尝试中依赖可编译代码):
这是框架钩子接口定义,依赖于上下文模板参数,框架基类本身将其作为非多态调用处理,并提供默认实现:
template<class Context>
class IFrameworkHooks
{
public:
virtual void funcImpl(Context* context) = 0;
virtual ~IFrameworkHooks() {}
};
现在我想实现一个模拟类,实现IFrameWorkHooks<>
接口:
template<class Context, class InnerInterface>
class MyTemplateMock
: public FrameworkBaseClass<MyTemplateMock<Context,InnerInterface>,Context,InnerInterface>
, public IFrameworkHooks<Context>
{
public:
// Compiler error here:
MOCK_METHOD1(funcImpl, void (Context* context));
virtual ~MyTemplateMock() {}
protected:
MyTemplateMock()
{
// Compiler error here:
ON_CALL(*this, funcImpl(_))
.WillByDefault(Invoke(this, &MyTemplateMock<Context,InnerInterface>::funcImplCall));
}
void funcImplCall(Context* context)
{
}
};
我得到一个编译器错误,说:
error: need ‘typename’ before ‘testing::internal::Function<void(Context*)>::Result’ because ‘testing::internal::Function<void(Context*)>’ is a dependent scope
error: type/value mismatch at argument 1 in template parameter list for ‘template<class T> class testing::Matcher’
error: expected a type, got ‘testing::internal::Function<void(Context*)>::Argument1’
是否有可能专门化ON_CALL()
宏中用于模板参数的gmock匹配器?还是我漏掉了。其他的吗? ?
我认为你需要模板版本的gmock的宏有_T
追加:
MOCK_METHOD1_T(funcImpl, void (Context* context));
要了解更多信息,请参阅文档中的"Mocking Class Templates"章节。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在命名空间中定义函数还是限定函数
- 此代码是否违反一个定义规则
- 编译C++时未定义的引用
- 不同翻译单元中不可重载的非内联函数定义
- 在C++中,我想通过使用来自变量(例如字符串)的typename信息,从模板中定义一个类对象
- 如果函数是在类的主体中定义的,我是否需要在成员函数的返回类型中指定 typename?
- 如何在<typename> <long> 不更改给定代码的情况下将自定义向量与 STL 向量相互转换?
- 为什么我应该使用"typename"关键字来定义?
- 在越界成员定义的类型说明符中是否可以省略typename
- []<typename>(){} 是有效的 lambda 定义吗?
- 模板化模拟类中缺少MOCK_METHODx() 定义'typename'