C++ 测试C+;时无法推断模板参数+;用谷歌模拟
我的代码使用GoogleMock测试类EventLogger 首先,编译失败,因为编译器在宏中找不到模板的参数,因此无法扣除参数:C++ 测试C+;时无法推断模板参数+;用谷歌模拟,c++,unit-testing,templates,macros,googlemock,C++,Unit Testing,Templates,Macros,Googlemock,我的代码使用GoogleMock测试类EventLogger 首先,编译失败,因为编译器在宏中找不到模板的参数,因此无法扣除参数: candidate: template<class T, class ... Args> auto Filler<traceType>::fill(Args&& ...) [with T = T; Args = {Args ...}; Class1 traceType = (Class1)1u] WRAP_MOCKED_TE
candidate: template<class T, class ... Args> auto Filler<traceType>::fill(Args&& ...)
[with T = T; Args = {Args ...}; Class1 traceType = (Class1)1u]
WRAP_MOCKED_TEMPL_METHOD_1(fill, T);
^
In definition of macro 'WRAP_MOCKED_TEMPL_METHOD_1'
auto NAME(Args &&...args)\
^
Template argument deduction/substitution failed:
WRAP_MOCKED_TEMPL_METHOD_1(fill, T);
Couldn't deduce template parameter 'T''
模拟填充的构造函数
class MockFillerConstructor
{
public:
MOCK_METHOD0(construct, std::shared_ptr<MockFiller<Class1::TYPE_1>>());
};
类MockFillerConstructor
{
公众:
MOCK_METHOD0(构造,std::shared_ptr());
};
在使用宏测试的类中调用类
#define WRAP_MOCKED_TEMPL_METHOD_1(NAME, TEMPL) \
template <typename TEMPL, typename ...Args>\
auto NAME(Args &&...args)\
{\
return this->mock().NAME<TEMPL>(std::forward<Args>(args)...);\
}
template <Class1 traceType>
class Filler : public CopyableMockBase<MockFiller<traceType>>
{
public:
WRAP_MOCKED_TEMPL_METHOD_1(fill, T);
};
\define WRAP\u mock\u temp\u METHOD\u 1(名称、模板)\
模板\
自动名称(Args&&…Args)\
{\
返回此->mock().NAME(std::forward(args)…)\
}
模板
类填充符:publiccopyablemockbase
{
公众:
包装模拟模板方法1(填充,T);
};
所以我的问题是:
- 为什么编译器不能自动找到模板参数
- 为什么我的代码V2包含语法错误
感谢您的帮助我对Google Mock一无所知,但您的V2缺少一个
模板
关键字:
filler.template fill<Message>(buffer, data, getMessage()); // V2
(还要注意this->mock()中缺少的模板
。在这里再次填充,但这不是重点)<代码>T
未在功能参数列表中引用。编译器将如何推断它应该是什么?你为什么需要这个T
?你就不能这样做吗
template <typename... Args>
auto fill(Args &&...args)
{
return this->mock().fill(std::forward<Args>(args)...);
}
模板
自动填充(Args&&…Args)
{
返回此->mock().fill(std::forward(args)…);
}
class MockFillerConstructor
{
public:
MOCK_METHOD0(construct, std::shared_ptr<MockFiller<Class1::TYPE_1>>());
};
#define WRAP_MOCKED_TEMPL_METHOD_1(NAME, TEMPL) \
template <typename TEMPL, typename ...Args>\
auto NAME(Args &&...args)\
{\
return this->mock().NAME<TEMPL>(std::forward<Args>(args)...);\
}
template <Class1 traceType>
class Filler : public CopyableMockBase<MockFiller<traceType>>
{
public:
WRAP_MOCKED_TEMPL_METHOD_1(fill, T);
};
filler.template fill<Message>(buffer, data, getMessage()); // V2
template <typename T, typename... Args>
auto fill(Args &&...args)
{
return this->mock().fill<T>(std::forward<Args>(args)...);
}
template <typename... Args>
auto fill(Args &&...args)
{
return this->mock().fill(std::forward<Args>(args)...);
}