Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将函数传递给类_C++_Class_Templates - Fatal编程技术网

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);
}