我正在尝试做一些我认为非常简单的事情 - 传递一个队列和一个函数,并将该函数应用于队列中的每个项目 - 但我无法将其编译。
class Foo
{
public:
void doStuff();
void doStuffOnBars(std::queue<Bar*> &bars, void (*func)(Bar &bar));
virtual void stuff(Bar &bar) = 0;
std::queue<Bar*> _bars;
};
void Foo::doStuff()
{
doStuffOnBars(_bars, stuff);
}
void Foo::doStuffOnBars(std::queue<Bar*> &bars, void (*func)(Bar &bar))
{
while (!bars.empty())
{
func(*bars.front());
bars.pop();
}
}
doStuffOnBars(_bars, stuff)
和doStuffOnBars(_bars, this->stuff)
返回C3867。
doStuffOnBars(_bars, &stuff)
和doStuffOnBars(_bars, &this->stuff)
返回C2276。
doStuffOnBars(_bars, &(Foo::stuff))
的 void doStuffOnBars(std::queue<Bar*> &bars, void (Foo::*func)(Bar &bar))
会返回C2064。
所以我完全没有想法。我见过的所有函数指针的例子似乎都神奇地起作用 - 我认为它们中的大多数都在全球范围内?为什么这与成员函数不同?
答案 0 :(得分:2)
在我提出这个问题之前,我已经设法自己解决了这个问题(经过一些咬指甲和拔毛之后)。我会为其他人提供工作代码的参考:
class Foo
{
public:
void doStuff();
void doStuffOnBars(std::queue<Bar*> &bars, void (Foo::*func)(Bar &bar));
virtual void stuff(Bar &bar) = 0;
std::queue<Bar*> _bars;
};
void Foo::doStuff()
{
doStuffOnBars(_bars, stuff);
}
void Foo::doStuffOnBars(std::queue<Bar*> &bars, void (Foo::*func)(Bar &bar))
{
while (!bars.empty())
{
(this->*func)(*bars.front());
bars.pop();
}
}
必须使用(this->*func)
调用该函数 - 该函数需要一个对象引用(this
)并且该函数需要被解引用(毕竟它是一个指针) 。现在,我知道,它似乎非常明显,并且很有意义!!但是我想如果你不熟悉使用函数指针那么它会引起一些混乱 - 这就是我发布这个答案的原因。