假设我有这门课程:
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;
}
如何制作此课程的实例? 我试过了:
typedef bool (*someFunc)(int);
typedef bool (*someFunc2)(int, int);
findMax<int, someFunc, someFunc2> u(7, isValid, areSame); // Doesn't compile, error below.
错误讯息:
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;
}
但这不起作用。我也尝试了其他方法,但无法找到如何做到这一点。
那我该怎么办呢?
答案 0 :(得分:1)
你需要整理你的构造函数声明/定义,也可能你的成员声明(它可能应该是一个值而不是一个指针)。有了这个,就应该直接创建对象。
就个人而言,我实际上既不指定模板参数,又创建合适的工厂函数。例如:
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);
}