簡體   English   中英

使用google mock測試C ++時無法推斷出模板參數

[英]Could not deduce template argument when testing C++ with google mock

我的代碼使用Google mock來測試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''

所以我嘗試在調用函數時顯式添加參數(注釋//代碼中的V2),但隨后出現另一條錯誤消息: filler.fill<Message>(buffer, data, getMessage());

In member function
void EventLogger<traceType>::write(const buffer&, const Message&):
Error: expected primary-expression before '>' token
    `filler.fill<Message>(buffer, data, streamInd);`
                        ^

### Code ###這是我的代碼。

經過階級測試

template <Class1 traceType>
class EventLogger
{
public:
    template <typename Message>
    void write(const c1& buffer, const Message& data)
    {
        filler.fill(buffer, data, getMessage());            // V1
        filler.fill<Message>(buffer, data, getMessage());   // V2
    }

private:
    Filler<traceType> filler;
};

MockClass

template <Class1 traceType>
class MockFiller
{
public:
    MOCK_METHOD3(send, void(c1, const Data::SendReq& msg, Class1::StreamInd&));
    MOCK_METHOD3(receive, void(c1, const Data::ReceiveReq& msg, Class1::StreamInd&));

    template <typename Message>
    void fill(c1 buffer, const Message&, Class1::StreamInd& streamInd)
    {
        ASSERT_TRUE(false);
    }
};

您可以在Google文檔中找到宏MOCK_METHODX說明

MockClass的專業化

template <>
template <>
void MockFiller<Class1::TYPE_1>::fill<Data::SendReq>(c1 buffer,
            const Data::SendReq& msg, Class1::StreamInd& streamInd)
{
    send(buffer, msg, streamInd);
}

template <>
template <>
void MockFiller<Class1::TYPE_1>::fill<Data::ReceiveReq>(c1 buffer,
            const Data::ReceiveReq& msg, Class1::StreamInd& streamInd)
{
    receive(buffer, msg, streamInd);
}

MockFiller的構造函數

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

所以我的問題是:

  • 為什么編譯器不會自動找到模板參數
  • 為什么我的代碼的V2包含語法錯誤

謝謝你的幫助

我對Google Mock一無所知,但您的V2缺少template關鍵字:

filler.template fill<Message>(buffer, data, getMessage());   // V2

當編譯器解析EventLogger ,它不知道Filler<traceType>::fill應該是什么,以及Filler<traceType>::fill<是否意味着打開模板參數列表或者只是一個小於運算符。 如果沒有template關鍵字,則假設后者。

編輯哦等一下。 對於V1,當然它不能推斷T 替換宏,您可以像這樣定義Filler<traceType>::fill

template <typename T, typename... Args>
auto fill(Args &&...args)
{
    return this->mock().fill<T>(std::forward<Args>(args)...);
}

(還要注意this->mock().fill<T>缺少的template this->mock().fill<T>再次在這里this->mock().fill<T> ,但這真的是除了這一點之外)。 函數參數列表中未引用T 編譯器如何推斷它應該是什么? 為什么你甚至需要T 你不能只做以下事情嗎?

template <typename... Args>
auto fill(Args &&...args)
{
    return this->mock().fill(std::forward<Args>(args)...);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM