vector<T> m;
是模板类中的私有成员。
template<class T>
bool Matrix_lt<T> :: isNotZero(T val) {
return val != 0;
}
是同一模板类中的私有函数。
template<class T>
int Matrix_lt<T> :: calL0Norm() {
int count = count_if(m.begin(), m.end(), isNotZero<T>);//ERROR
}
是同一模板类中的公共函数。
错误:'>'标记之前应为主表达式。为什么?
isNotZero<T>
是一个成员函数,因此它有一个隐含的this
的第一个参数。您需要一个一元函子,因此需要使用std::bind
来绑定this
作为第一个参数。
您还需要将函数称为&Matrix::isNotZero<T>
。所以,
using namespace std::placeholders;
auto f = std::function<bool(const T&)> f = std::bind(&Matrix::isNotZero<T>,
this, _1);
并使用CCD_ 6作为CCD_。
或者,使用lambda:
int count = count_if(m.begin(), m.end(),
[this](const T& val) { return this->isNotZero<T>(val);});
isNotZero
是一个成员函数。你不能那样使用这个。使用lambda:
template<class T>
int Matrix_lt<T> :: calL0Norm() {
int count = count_if(m.begin(),
m.end(),
[this](T const & val) { return this->isNotZero(v);} );
}
或者使用std::bind
。
这里有两个问题。
-
根据您的定义,
isNotZero
不是模板函数,它是模板类的成员函数。不能使用模板参数引用非模板函数。使用
int count = count_if(m.begin(), m.end(), isNotZero);
-
isNotZero
是一个非静态成员函数。不能传递这样的成员函数。在这种情况下,我认为可以将
isNotZero
作为一个静态成员函数。