отсутствует «typename» для определений MOCK_METHODx () в шаблонном классе mock

У меня есть ошибка компилятора с gmock и шаблонным классом, который должен использоваться в качестве основы для производных (конкретных) классов.

Цель состоит в том, чтобы протестировать методы обратного вызова, поддерживаемые каркасом, но базовые классы каркаса зависят от конечной реализации (короче говоря, это каркас стиля шаблона CRTP, который внедряет объявления статического интерфейса) —

Я пытаюсь набросать то, что у меня есть (пожалуйста, не полагайтесь на компилируемый код с 1-й попытки):

Это определение интерфейса перехватчиков фреймворка, которое зависит от параметра шаблона Context, сам базовый класс фреймворка обрабатывает его как неполиморфный вызов и предоставляет реализацию по умолчанию:

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’

Можно ли специализировать gmock Matcher, используемый в ON_CALL() макрос для параметра шаблона как-нибудь? Или я скучаю по Sth. еще ??

3

Решение

Я думаю, что вам нужна шаблонная версия макросов Gmock, которые имеют _T прилагается:

MOCK_METHOD1_T(funcImpl, void (Context* context));

Для получения дополнительной информации см. Раздел «Шаблоны классов Mocking» в документы.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]