2016-11-26 6 views
1

Я новичок в библиотеке Boost. Я хочу, чтобы программа, которая может вычислить мин, макс, среднее и дисперсия вектора расстояния (типа std::vector <double>), и я написал следующий кодboost accumulator_set: ожидать первичного выражения

std::vector <double> dist_err; 
// ... do something with dist_err 
boost::accumulators::accumulator_set 
< 
    double, 
    boost::accumulators::stats 
    < 
     boost::accumulators::tag::min , 
     boost::accumulators::tag::max , 
     boost::accumulators::tag::mean, 
     boost::accumulators::tag::variance 
    > 
> stat_acc; 
std::for_each(dist_err.begin(), dist_err.end(), boost::bind <void> (boost::ref(stat_acc), boost::mpl::placeholders::_1)); 
std::cout << "min[distance error]: " << boost::accumulators::min  (stat_acc) << std::endl; 
std::cout << "MAX[distance error]: " << boost::accumulators::max  (stat_acc) << std::endl; 
std::cout << " E[distance error]: " << boost::accumulators::mean  (stat_acc) << std::endl; 
std::cout << "VAR[distance error]: " << boost::accumulators::variance (stat_acc) << std::endl; 

Но программа дает мне сообщение об ошибке в строке std::for_each(dist_err.begin(), dist_err.end(), boost::bind <void> (boost::ref(stat_acc), boost::mpl::placeholders::_1)); и говорит

error: expected primary-expression before ')' token 
std::for_each(dist_err.begin(), dist_err.end(), boost::bind <void> (boost::ref(stat_acc), boost::mpl::placeholders::_1)); 

Может кто-нибудь, пожалуйста, дайте мне некоторый намек на то, как решить эту ошибку?

ответ

2

Проблема в том, что вы используете boost::mpl::placeholders::_1 код внутри, который не использует MPL. Вместо этого просто скажите _1.

+0

Привет, Джон, он работает! Большое спасибо за ваш ответ. Но я все еще немного смущен ... не могли бы вы попытаться объяснить, откуда этот «_1», и что это значит? –

+0

@BojianZheng: '_1' происходит от Boost, хотя и не в пространстве имен' boost :: '. Он также является частью стандарта C++ 11, который имеет 'std :: bind()'. Если вы хотите знать, что это значит, просто прочитайте документацию. –