您好我的回调函数有问题。我对c ++很新。 我有两个类助手和导出器:
助手:
class Helper {
typedef Bool (*IterationCallback)(BaseObject *op);
public: Int32 RecurseHierarchy (BaseObject* op, IterationCallback callback) {
Int32 count = 0;
while (op) {
if (callback(op)) {
count++;
count += RecurseHierarchy(op->GetDown(), callback);
op = op->GetNext();
}
}
return count;
}
};
出口:
class Exporter {
private: Helper helper;
private: Bool writeT3D (Filename exportT3D) {
string filepath = C4DStringToStdString(exportT3D.GetString());
t3DFile.open(filepath.c_str());
writeBegin();
// Iterate all objects in the document and writes an actor
BaseDocument *doc = GetActiveDocument();
Int32 count = helper.RecurseHierarchy(doc->GetFirstObject(), this->WriteActor);
writeEnd();
t3DFile.close();
return true;
}
};
我收到错误C3867 function call missing argument list
,我应该使用&Exporter::WriteActor
。但我无法解决问题。有人能帮助我吗?
答案 0 :(得分:0)
假设WriteActor
是Exporter
的成员函数,那么它的类型可能是:
Bool (Exporter::*)(BaseObject*)
与以下内容不兼容:
Bool (*)(BaseObject*)
原因是前者在类型Exporter*
中传递了一个隐式参数(通常在成员函数中可以作为this
访问),而后者则不会发生这种情况。
由于上述原因,在将结果函数传递给Exporter*
之前,需要显式传递RecurseHierarchy
类型的隐式参数。
在您的情况下,您可以使用std::bind
,如下所示:
using namespace std::placeholders;
auto fn = std::bind(&Exporter::WriterActor, this, _1);
Int32 count = helper.RecurseHierarchy(doc->GetFirstObject(), fn);
然后修改Helper
以获取任何可调用对象:
struct Helper {
template<typename Fn>
Int32 RecurseHierarchy(BaseObject* op, Fn callback) {
Int32 count = 0;
while (op) {
if (callback(op)) {
count++;
count += RecurseHierarchy(op->GetDown(), callback);
op = op->GetNext();
}
}
return count;
}
};
如果您还想允许传递std::function
个对象和lambda,则上述更改尤为重要。