Конструктор классов & lt; неразрешенный перегруженный тип функции & gt; при попытке передать метод агрегированного объекта его методу класса [duplicate]

Другой общий случай, когда можно получить это исключение, включает в себя насмешливые классы во время модульного тестирования. Независимо от используемой насмешливой структуры, вы должны убедиться, что все соответствующие уровни иерархии классов должным образом высмеиваются. В частности, все свойства HttpContext, на которые ссылается тестируемый код, должны быть изделены.

См. « Исключение NullReferenceException при проверке пользовательского AuthorizationAttribute » для несколько подробного примера.

2
задан Denis 10 August 2011 в 19:53
поделиться

2 ответа

Следующий класс функций будет соответствовать сигнатуре вашего FuncType:

struct Foo
{
    AnotherClass & a_;
    Foo(AnotherClass & a) a_(a) {}

    double operator()(int i) const
    {
        return a_.funcAnother(i);
    }
};

Измените MyClass :: вычислите шаблон, таким образом:

template<typename FuncType>
void MyClass::compute(FuncType foo) 
{
    int a=1;
    foo(a);
}

Затем вы можете позвонить выполните следующие действия:

void MyClass::run()
{
    compute(Foo(*obj_));
}

Если ваш компилятор поддерживает lambdas (и есть хорошая вероятность, что он это делает), вы можете отказаться от класса функции и просто определить выполнение следующим образом:

void MyClass::run()
{
    auto f = [this](int i) {
        return obj_->funcAnother(i);
    };

    compute(f);
}
1
ответ дан Benjamin Lindley 1 September 2018 в 06:04
поделиться

Поскольку

funcAnother(int i);

является функцией-членом, он передает неявный this, а затем прототип не соответствует типу вашего указателя функции.

Типпечатание для указатель на функцию-член должен быть:

typedef double (AnotherClass::*funcPtr)(int);

Здесь - модифицированная компилируемая версия вашего кода. Пожалуйста, ознакомьтесь со встроенными комментариями, чтобы понять изменения. Также я оставил другие детали, вы можете добавить это.

3
ответ дан talonmies 1 September 2018 в 06:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: