2013-04-15 2 views
1

меня скачать источник изC++ 11 «авто» в нераскрытом C++ 11 компилятора

http://matt.eifelle.com/2012/07/17/just-a-small-example-of-numerical-optimization-in-c/

и попытаться собрать в г ++ 4.4.6, которые не знаю о авто происходят некорректно источник:

auto optimizer = Optimization::Local::build_simplex( 
    fun, 
    Optimization::Local::make_and_criteria(Optimization::Local::IterationCriterion(max_iterations), 
     Optimization::Local::RelativeValueCriterion<float>(ftol))); 

Чтения веб-страницы, я знаю, что это происходит потому, что авто поддерживаются в C++ 11, так что я пытаюсь найти источник, что я скачал, есть simplex.h, который имеет следующий исходный код:

template<class Function, class Criterion> 
static Simplex<typename Function::DataType, typename Function::ParameterType, Function, Criterion> build_simplex(const Function& fun, const Criterion& criterion) 
{ 
    return Simplex<typename Function::DataType, typename Function::ParameterType, Function, Criterion>(criterion); 
} 

тогда я изменю

auto optimizer 

в

Simplex<typename Function::DataType, typename Function::ParameterType, Function, Criterion> optimizer 

или

Optimization::Simplex<typename Function::DataType, typename Function::ParameterType, Function, Criterion> optimizer 

никто не будет проходить компилятор !!

Я мало знаю о использовании шаблона C++, за исключением получения компиляции C++ 11, . Какую возвращаемую модификацию типа данных я должен сделать для этого авто?

Update:

Спасибо за любезно помочь, я могу изменить, чтобы int optimizer и компиляции, я получил: test_rosenbrock_simplex.cpp:44: error: cannot convert Optimization::Local::Simplex<float, Eigen::Matrix<float, 2, 1, 0, 2, 1>, Rosenbrock, Optimization::Local::AndCriteria<Optimization::Local::IterationCriterion, Optimization::Local::RelativeValueCriterion<float> > > к int при инициализации

затем изменить код:

Optimization::Local::Simplex<float, Eigen::Matrix<float, 2, 1, 0, 2, 1>, Rosenbrock, Optimization::Local::AndCriteria<Optimization::Local::IterationCriterion, Optimization::Local::RelativeValueCriterion<float> > > optimizer

это работает !!!!!

г ++ -O2 -march = родной -msse2 -m64 -DEIGEN_NO_DEBUG test_rosenbrock_simplex.cpp -I/дом/USRA/инструменты/собственный-Эйген-5097c01bcdc4 -o test_rosenbrock_simplex.exe

./test_rosenbrock_simplex.exe

-2.75 -0.5  0 
2.1875 1.125  0 
Starting point: 10 
10 
Starting value: 8181 
Best point: 1 
1 
Best value: 5.68434e-14 
+4

Это заставляет меня ценить 'auto' немного больше. – Rapptz

+2

Какая * актуальная * ошибка вы получаете? Вероятно, он длинный, но он также, вероятно, содержит ответ. –

+0

Вы пытались скомпилировать с '-std = C++ 11'? – RageD

ответ

7

Вы должны подставить в фактических аргументах шаблона, только объявленный тип возврата не сокращает его.

Как упоминал Дрю в комментарии, вы можете убедить компилятор рассказать вам об этом.

Просто напишите

int optimizer = .....; 

и проверить полученную ошибку.

+0

Спасибо, я обновил сообщение для решения, ваша любезная информация решает мою проблему !! – barfatchen

1

У Boost есть макрос, который реализует C++ 11 auto lookalike. Это называется BOOST_AUTO.

Это будет выглядеть так:

BOOST_AUTO(optimizer, Optimization::Local::build_simplex(
    fun, 
    Optimization::Local::make_and_criteria(Optimization::Local::IterationCriterion(max_iterations), 
    Optimization::Local::RelativeValueCriterion<float>(ftol))); 
0

В самом деле, либо использовать Boost, макро, или вы пишете полный тип самостоятельно. Извините, я не поместил все, но я бы закодировал это только с компилятором C++ 11. В противном случае придерживайтесь кода без шаблона. (Я автор блога).

Смежные вопросы