Автор: pe1e 7.3.2012, 21:46
Здравствуйте!
Я занимаюсь научной деятельностью,а конкретно моделированием стахостических процессов и проверкой статистических гипотез. Недавно столкнулся с библиотекой Boost, поэтому еще не совсем понимаю концепцию ее, хотя не скрываю,что не совсем понимаю открытые исходные файлы библиотеки. Проблема заключается в следующем: генератор случайных числе для Бета-распределения выдает ошибку на следующий код
#include<string.h>
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
#include<limits.h>
#include<boost/random.hpp>
#include<boost/random/mersenne_twister.hpp>
#include<boost/random/chi_squared_distribution.hpp>
#include<boost/random/fisher_f_distribution.hpp>
#include <boost/math/distributions/normal.hpp>
#include <boost/math/distributions/weibull.hpp>
#include <boost/math/distributions/beta.hpp>
#include <boost/math/policies/policy.hpp>
#include <boost/random/variate_generator.hpp>
#include <boost/random/mersenne_twister.hpp>
#include<ctime>
#include<algorithm>
#include<locale.h>
#include<vector>
using boost::math::beta_distribution;
beta_distribution<> beta_dist(param[0], param[1]);
variate_generator<mt19937&, beta_distribution<>> beta_sampler(rng, beta_dist);
return beta_sampler();
следующие ошибки:
1> f:\nstu_university_labwork\8 semester\выпускная квалификационная бакалаврская работа\филоненко\criterionofhomogeneity\criterionofhomogeneity\sample.cpp(120): см. ссылку на создание экземпляров класса шаблон при компиляции "boost::random::variate_generator<Engine,Distribution>"
1> with
1> [
1> Engine=boost::random::mt19937 &,
1> Distribution=boost::math::beta_distribution<>
1> ]
1>d:\program files (x86)\microsoft visual studio 10.0\vc\include\boost\random\variate_generator.hpp(59): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "result_type"
1>d:\program files (x86)\microsoft visual studio 10.0\vc\include\boost\random\variate_generator.hpp(59): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>d:\program files (x86)\microsoft visual studio 10.0\vc\include\boost\random\variate_generator.hpp(59): error C2602: boost::random::variate_generator<Engine,Distribution>::result_type не является членом базового класса "boost::random::variate_generator<Engine,Distribution>"
1> with
1> [
1> Engine=boost::random::mt19937 &,
1> Distribution=boost::math::beta_distribution<>
1> ]
1> d:\program files (x86)\microsoft visual studio 10.0\vc\include\boost\random\variate_generator.hpp(59): см. объявление "boost::random::variate_generator<Engine,Distribution>::result_type"
1> with
1> [
1> Engine=boost::random::mt19937 &,
1> Distribution=boost::math::beta_distribution<>
1> ]
1>d:\program files (x86)\microsoft visual studio 10.0\vc\include\boost\random\variate_generator.hpp(59): error C2868: boost::random::variate_generator<Engine,Distribution>::result_type: недопустимый синтаксис для "using"-объявления; требуется полное имя
1> with
1> [
1> Engine=boost::random::mt19937 &,
1> Distribution=boost::math::beta_distribution<>
1> ]
Помогите пожалуйста. К сожалению,весь код выложить не могу,потому находится в разных файлах (в .h и .cpp файлах,связанных вместе).
Заранее спасибо!
Автор: Iron Bug 8.3.2012, 13:08
скорее всего, тут общесишная опечатка:
в конструкциях типа template1_name<template2_name<> > важно соблюдать пробел между последними закрывающими угловыми скобками "> >" иначе компилятор рассматривает эту конструкцию, как оператор сдвига >>.
попробуй поставить пробелы в таких конструкциях (beta_distribution<>>) и посмотреть на результат.
P.S. и ещё: процессы стОхАстические, а не стахостические
Автор: BRE 8.3.2012, 13:47
Цитата(Iron Bug @ 8.3.2012, 14:08)
скорее всего, тут общесишная опечатка:
в конструкциях типа template1_name<template2_name<> > важно соблюдать пробел между последними закрывающими угловыми скобками "> >" иначе компилятор рассматривает эту конструкцию, как оператор сдвига >>.
Вроде с C++11 эту ситуацию прояснили и разрешили писать слитно (новым компиляторам должно быть все равно).
Автор: Iron Bug 8.3.2012, 15:42
Цитата(BRE @ 8.3.2012, 16:47)
новым компиляторам должно быть все равно.
ну, может совсем новым и всё равно. а ещё до недавнего времени было нет. так что лучше исключить сразу подобную ситуацию, она обычно порождает множество непонятных ошибок компилятора.
Автор: pe1e 8.3.2012, 16:08
спасибо за конструктивную критику относительно моего русского - исправлюсь!
а что касается двойных скобочек,то VS2010 абсолютно ровно на это. В итоге пришел к выводу,что Бетта-распределение не генерирует случайных чисел и нашел аппроксимацию через равномерное распределение.
спасибо большое всем кто поучаствовал в этой теме!
Автор: BRE 8.3.2012, 16:09
Цитата(Iron Bug @ 8.3.2012, 16:42)
так что лучше исключить сразу подобную ситуацию, она обычно порождает множество непонятных ошибок компилятора.
Пока компиляторы не будут использовать режим C++11 по умолчанию нужно будет разделять. Я, скорее всего, и потом буду разделять ибо "привычка выработанная годами".