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
}
是同一模板类中的公共函数。
错误:'&gt;'之前预期的主要表达式令牌。 为什么?
答案 0 :(得分:3)
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);
并使用f
作为count_if
中的函子。
或者,使用lambda:
int count = count_if(m.begin(), m.end(),
[this](const T& val) { return this->isNotZero<T>(val);});
答案 1 :(得分:1)
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
。
答案 2 :(得分:0)
这里有两个问题。
根据您的定义,isNotZero
不是模板函数,它是模板类的成员函数。
您不能使用模板参数引用非模板函数。
使用int count = count_if(m.begin(), m.end(), isNotZero);
isNotZero
是一个非静态成员函数。你无法传递这样的成员函数。
我认为在这种情况下将isNotZero
作为静态成员函数是可以的。