评论:我再次发布此问题,因为有些人要求我发布完整代码。这是:
我有一个如下所示的函数指针typedef:
template<typename USER_DATA>
class RowProcessor
{
typedef void (*RowFunction)(USER_DATA, std::vector<USER_DATA> &);
RowProcessor(RowFunction, int) {};
};
然后我在另一个类UseRowProcessor中使用:
class UseRowProcessor {
public:
void AddUserData(SomeClass, std::vector<SomeClass> &);
void LoadUserData();
};
void UseRowProcessor::AddUserData(SomeClass c, std::vector<SomeClass> &v) {
v.push_back(c);
}
void UseRowProcessor::LoadUserData() {
RowProcessor<SomeClass> myRowProcessor(AddUserData, 1); // ERROR!!
}
因此调用RowProcessor的构造函数时会发生错误。
完整的错误消息显示
no insatnce of constructor "RowProcessor<USER_DATA>::RowProcessor [with USER_DATA=SomeClass]" matches the argument list
argument types are: (void (SomeClass c, std::vector<SomeClass, std::allocator<SomeClass>> &v), std::vector<SomeClass, std::allocator<SomeClass>>)
,除了构造函数参数不匹配之外,我不知道它的内容。
为什么我的AddUserFunction不匹配函数指针typedef ??
答案 0 :(得分:1)
更改功能:
void AddUserData(SomeClass, std::vector<SomeClass> &);
到static void AddUserData(SomeClass, std::vector<SomeClass> &);
。
由于它是一个类成员函数,因此它将在编译后添加,因此它不是函数指针的类型。通过将其更改为静态,不会添加此参数。
答案 1 :(得分:0)
正如马特所说,你需要一个static
函数来实现这个目标
class UseRowProcessor {
public:
static void AddUserData(SomeClass, std::vector<SomeClass> &);
void LoadUserData();
};
这里是completely fixed sample(修复到static
后还有一些问题。)
答案 2 :(得分:0)
会员功能与普通功能不同,这会延续到他们的类型。有一组解决方法使您能够将成员函数指针传递给以普通函数指针作为参数的函数,但如果您可以控制代码,则应采用不同的路径。而不是接受函数指针接受仿函数。
template<typename Functor>
int f(Functor func) {
// use func like you would a function, e.g. call it with arguments func(1, 2)
}
现在你可以使用lambda,函数对象,成员函数指针(在将它绑定到this
之后)或函数指针调用f。
如果您想避开模板,请接受std::function
,但只有在您有特殊原因时才应该这样做。