关于count_if的C++错误:之前需要主表达式


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

这里有两个问题。

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

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

  2. isNotZero是一个非静态成员函数。不能传递这样的成员函数。

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

相关内容

  • 没有找到相关文章

最新更新