Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 测试C+;时无法推断模板参数+;用谷歌模拟_C++_Unit Testing_Templates_Macros_Googlemock - Fatal编程技术网

C++ 测试C+;时无法推断模板参数+;用谷歌模拟

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

我的代码使用GoogleMock测试类EventLogger

首先,编译失败,因为编译器在宏中找不到模板的参数,因此无法扣除参数:

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)...);
}