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

У меня есть проблема с ошибкой компилятора с 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’

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


person πάντα ῥεῖ    schedule 26.04.2013    source источник
comment
Вы пытались поставить typename перед testing::internal::Function<void(Context*)>::Result? Это то, что вам нужно в сообщении об ошибке - возможно, это правильно. (Возможно, вам придется посмотреть на вывод препроцессора, чтобы выяснить, где он находится в вашем исходном коде.)   -  person David Schwartz    schedule 27.04.2013
comment
@DavidSchwartz Трудно сделать, потому что это скрыто внутри реализации gmocks MOCK_METHODx() ...   -  person πάντα ῥεῖ    schedule 27.04.2013


Ответы (1)


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

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

Дополнительную информацию см. в разделе "Шаблоны класса Mocking" в документации.

person Fraser    schedule 26.04.2013