c++模板类:没有构造函数实例与实参列表匹配

C++ template class: No instance of constructor matches the argument list

本文关键字:实例 实参 列表 构造函数 c++      更新时间:2023-10-16

评论:我再次发布这个问题,因为有些人要求我发布完整的代码。

我有一个函数指针类型定义,看起来像这样:

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不匹配函数指针类型定义??

测试LINK<& lt; & lt; & lt; & lt; & lt; & lt; & lt;

修改函数:

void AddUserData(SomeClass, std::vector<SomeClass> &);

static void AddUserData(SomeClass, std::vector<SomeClass> &); .

由于是类成员函数,this形参在编译后会被添加,所以它不是函数指针的类型。如果将其更改为static,则不会添加此参数。

正如Matt所说,您需要static函数才能使此工作

class UseRowProcessor {
public:
    static void AddUserData(SomeClass, std::vector<SomeClass> &);
    void LoadUserData();
};

这是完全固定的样本(有一些更多的问题后修复到static)。

成员函数不同于普通函数,这体现在它们的类型上。有一组变通方法使您能够将成员函数指针传递给以普通函数指针作为参数的函数,但如果您可以控制代码,则应该采用不同的路径。不接受函数指针,接受函子

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代替,但这应该只在你有特殊原因的情况下完成。