c++模板类:没有构造函数实例与实参列表匹配
C++ template class: No instance of constructor matches the argument list
评论:我再次发布这个问题,因为有些人要求我发布完整的代码。
我有一个函数指针类型定义,看起来像这样:
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
代替,但这应该只在你有特殊原因的情况下完成。
相关文章:
- 非类型引用形参/实参
- 成员函数指针的模板实参演绎
- 函数和函数作为模板函数的实参
- Const到非Const指针模板实参的转换
- 传递boost::函数,该函数接受一个模板实参作为默认为NULL的形参
- 当实参是初始化列表而形参是引用时,重载解析
- 函数模板中返回类型的模板实参演绎
- ostream_iterator的模板实参-每个元素都是pair
- c++——关于使用默认实参的困惑
- std::shared_ptr、继承和模板实参演绎的问题
- 将操作符转换为模板实参的特化
- 使用模板模板形参时,模板实参推导失败
- 带有const实参的c++构造函数
- 函数指针作为模板实参而不是函子
- c++临时对象绑定到实参并返回const引用值
- 调用对象作为默认实参的this
- 当涉及一个重载函数作为实参时,模板实参推导是如何工作的
- c++模板类:没有构造函数实例与实参列表匹配
- vc++函数模板实例化错误C2664当使用不同的枚举实参时
- 接受函数模板实参的类模板,这些实参对正在定义的类的实例进行操作