错误C2864:'Generator :: ci':只能在类中初始化静态const积分数据成员

时间:2016-08-21 14:37:41

标签: c++

您好我正在尝试使用VistualStudio 2008编译应用程序,但这些错误正在显示:

Error   2   error C2864: 'Generator::ci' : only static const integral data members can be initialized within a class    f:\virtualdub\roslogoaway\dehaze\file\main.cpp  99  dehaze
Error   3   error C2864: 'Generator::c' : only static const integral data members can be initialized within a class f:\virtualdub\roslogoaway\dehaze\file\main.cpp  100 dehaze
Error   8   error C2679: binary '-=' : no operator found which takes a right-hand operand of type 'cv::Vec<_Tp,cn>' (or there is no acceptable conversion)  f:\virtualdub\roslogoaway\dehaze\file\main.cpp  340 dehaze

产生这些错误的代码部分是:

template <class ForwardIterator,class Generator>
void generate(ForwardIterator first,ForwardIterator last,Generator g)
{
    while(first!=last)
{
    *first++ = g();
}

}

struct Generator
{
    Generator():ci(0.0){}
    Generator(float c_init):c(c_init){}
    float operator()(){ci+=c;return ci;}
    float operator()(float c_init){c=c_init;return c;}
    float ci=0.0;
    float c=0.0;
};

(...)

cv::Mat dehaze(cv::Mat& image,cv::Mat& difference,cv::Point ale,int k,int rho,double xi)
{
 cv::Mat output = cv::Mat(image.rows,image.cols,image.type());
 float c = 1.0/k;
 vector<float> ci(k);
 std::generate(ci.begin(),ci.end(),Generator(c));

 vector<cv::Mat> layers;
 vector<cv::Mat> mask_layers;
 vector<cv::Mat> diff_layers;
 Vec3f ale_temp= image.at<cv::Vec3f>(ale);

 for(int i=0;i<ci.size();i++)
 {
     cv::Mat layer=image.clone();

     layer-=(ci[i]*ale_temp); <------ here

我不知道如何解决这个问题。非常感谢您的帮助

1 个答案:

答案 0 :(得分:1)

前两个错误是关于cic的课堂初始化。这是一个C ++ 11功能,只有Visual C ++ 2015及更高版本支持。您必须在构造函数中初始化它们:

struct Generator
{
    Generator():ci(0.0), c(0.0f) {}
    Generator(float c_init):ci(0.0), c(c_init){}
    float operator()(){ci+=c;return ci;}
    float operator()(float c_init){c=c_init;return c;}
    float ci;
    float c;
};

第三个错误是无关的。您试图从cv::Vec3f中减去cv::Mat,这没有任何意义。我不知道你在这里做了什么,所以我无法提供更多的帮助。

顺便说一句,Visual C ++ 2008 old