C++ 将函数传递给类
假设我有这个班:C++ 将函数传递给类,c++,class,templates,C++,Class,Templates,假设我有这个班: template<class K, class func1, class func2> class findMax { K* key; func1 cmp; func2 areSame; }; template<class K, class func1, class func2> findMax<K, func1, func2>::findMax(K n, func1 isValid, func2 areSameFu
template<class K, class func1, class func2>
class findMax {
K* key;
func1 cmp;
func2 areSame;
};
template<class K, class func1, class func2>
findMax<K, func1, func2>::findMax(K n, func1 isValid, func2 areSameFunc) {
cmp = isValid;
areSame = areSameFunc;
}
但这不起作用。我也尝试过其他方法,但找不到如何做到这一点
那么我该怎么做呢?您需要整理构造函数声明/定义,可能还需要整理成员声明(它可能应该是值而不是指针)。这样就可以直接创建对象了 就个人而言,我不会同时指定模板参数,而是创建一个合适的工厂函数。例如:
template<typename K, typename Fun1, typename Fun2>
class findMax {
K key;
Fun1 cmp;
Fun2 areSame;
public:
findMax(K n, Fun1 isValid, Fun2 areSameFunc)
: key(n)
, cmp(isValid)
, areSame(areSameFunc) {
}
};
template<typename K, typename Fun1, typename Fun2>
findMax<K, Fun1, Fun2> makeFindMax(K n, Fun1 fun1, Fun2 fun2) {
return findMax<K, Fun1, Fun2>(n, fun1, fun2);
}
bool isValid (int k) {
return (k>0);
}
bool areSame (int key, int key2) {
return key==key2;
}
int main() {
auto obj = makeFindMax(7, isValid, areSame);
}
模板
类findMax{
K键;
Fun1-cmp;
Fun2是相同的;
公众:
findMax(KN,Fun1有效,Fun2为amefunc)
:键(n)
,cmp(isValid)
,AreName(areSameFunc){
}
};
样板
findMax makeFindMax(KN,Fun1 Fun1,Fun2 Fun2){
返回findMax(n,fun1,fun2);
}
bool是有效的(int k){
返回(k>0);
}
bool arame(int键,int键2){
返回键==键2;
}
int main(){
auto obj=makeFindMax(7,isValid,arame);
}
“什么代码不起作用?”CasgZnEnic抱歉,补充说。“有人问问题,用代码> STD::函数< /C>用C++代码。@某个人有问题>代码> / /不编译< /COD>不是很有见识。在您的问题中发布一条完整的错误消息。您定义了构造函数,但从未在类中声明过它…感谢您的回答。findMax实际上位于头文件中,我发布的其余代码位于源文件中。有没有一种方法可以做到这一点,而不必从源文件调用另一个函数来创建新的findMax
?@SomeoneWithAQuestion:在头文件中声明工厂函数也没有错。但是,一旦正确定义了构造函数,就可以像在makeFindMax()中那样调用它。
Invalid arguments '
Candidates are:
findMax(const findMax<int,bool (*)(int, int),bool (*)(int)> &)
findMax()
findMax(int, #10000, ?, ?)
'
bool isValid (int k) {
return (k>0);
}
bool areSame (int key, int key2) {
return key==key2;
}
template<typename K, typename Fun1, typename Fun2>
class findMax {
K key;
Fun1 cmp;
Fun2 areSame;
public:
findMax(K n, Fun1 isValid, Fun2 areSameFunc)
: key(n)
, cmp(isValid)
, areSame(areSameFunc) {
}
};
template<typename K, typename Fun1, typename Fun2>
findMax<K, Fun1, Fun2> makeFindMax(K n, Fun1 fun1, Fun2 fun2) {
return findMax<K, Fun1, Fun2>(n, fun1, fun2);
}
bool isValid (int k) {
return (k>0);
}
bool areSame (int key, int key2) {
return key==key2;
}
int main() {
auto obj = makeFindMax(7, isValid, areSame);
}