关于count_if的C ++错误:期望的primary-expression之前

时间:2014-04-10 07:02:19

标签: c++ oop templates stl stl-algorithm

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;'之前预期的主要表达式令牌。 为什么?

3 个答案:

答案 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)

这里有两个问题。

  1. 根据您的定义,isNotZero不是模板函数,它是模板类的成员函数。

    您不能使用模板参数引用非模板函数。 使用int count = count_if(m.begin(), m.end(), isNotZero);

  2. isNotZero是一个非静态成员函数。你无法传递这样的成员函数。

    我认为在这种情况下将isNotZero作为静态成员函数是可以的。