Передача функторов и указателей на функции взаимозаменяемо с использованием шаблонного метода в переполнении стека

В настоящее время у меня есть шаблонный класс с шаблонным методом. Прекрасно работает с функторами, но возникают проблемы при компиляции функций.

foo.h

template <typename T>
class Foo {
public:
// Constructor, destructor, etc...
template <typename Func>
void bar(T x, Func f);
};

template <typename T>
template <typename Func>
void Foo<T>::bar(T x, Func f) { /* some code here */ }

main.cpp

#include "Foo.h"template <typename T>
class Functor {
public:
Functor() {}
void operator()(T x) { /* ... */ }
private:
/* some attributes here */
};

template <typename T>
void Function(T x) { /* ... */ }

int main() {
Foo<int> foo;
Functor<int> F;
foo.bar(2, F); // No problem
foo.bar(2, Function); // <unresolved overloaded function type>
return 0;
}

1

Решение

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

foo.bar(2, static_cast<void(*)(int)>(&Function);

В указанном случае функция на самом деле является шаблоном, то есть вы также можете напрямую обратиться к ее специализации:

foo.bar(2, &Function<int>);
3

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

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

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