Я не думаю, что можно вызвать члена класса, который не определен в текущей области видимости. В этом случае функтор не сохраняет состояния и ведет себя как функция, которая не принимает параметров и не возвращает значений, поэтому вы можете назначить ее экземпляр необработанному указателю на функцию. Однако это уже не foo : это просто указатель на функцию.
Одним из решений является получение foo из чисто виртуального базового класса, определенного в глобальной области видимости, такого как:
class base
{
public:
void operator()() { doit(); }
protected:
virtual void doit() = 0;
};
int main()
{
class foo
{
public:
void operator()() { doit(); }
protected:
virtual void doit()
{
std::cout << "Hello" << std::endl;
}
};
}
Теперь вы можете передавать экземпляр foo как base , и виртуальный метод doit () будет вызываться, как и ожидалось.