C++11 "auto"到非 C++11 编译器
C++11 "auto" to an non C++11 compiler
我已经从
下载了源代码http://matt.eifelle.com/2012/07/17/just-a-small-example-of-numerical-optimization-in-c/并尝试在g++ 4.4.6中编译,它不知道以下源代码的auto:
auto optimizer = Optimization::Local::build_simplex(
fun,
Optimization::Local::make_and_criteria(Optimization::Local::IterationCriterion(max_iterations),
Optimization::Local::RelativeValueCriterion<float>(ftol)));
阅读网页,我知道这是因为auto在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
或to
Optimization::Simplex<typename Function::DataType, typename Function::ParameterType, Function, Criterion> optimizer
none将通过编译器!!
我不太了解c++的模板用法,除了得到一个c++11编译,我应该为这个auto做哪些返回的数据类型修改?
更新:谢谢你的帮助,我修改到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
它工作!!!!!
g++ -O2 -march=native -msse2 -m64 -DEIGEN_NO_DEBUG test_rosenbrock_simplex.cpp-I/home/usrA/tools/eigen-eigen-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
您必须在实际的模板参数中替换,仅仅声明返回类型是不够的。
正如Drew在评论中提到的,你可以说服编译器告诉你这些。
简单地写
int optimizer = .....;
Boost有一个宏实现了类似c++11的自动功能。它叫做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)));
实际上,您要么使用Boost宏,要么自己编写完整的类型。很抱歉我没有把所有的东西都放进去,但我只会用c++ 11编译器来编写这个代码。否则,坚持使用非模板代码。(我是博客作者)。
- 添加 c++11 编译器后打开 devc++ 时显示的警告
- 在代码优化过程中,C++11编译器是否会在可能的情况下将局部变量转换为右值
- 使用数组作为地图密钥不使用C 11编译器命令
- C++11 编译器混淆了类和同名类方法
- 哪些适用于 Windows 的 C++11 编译器支持新的类型特征,如"is_nothrow_move_constructible"?
- 为什么C++11编译器支持仍然需要一个标志
- C++11 编译器生成的函数
- -std=c++11 编译器标志是否会在某个时候成为默认值
- 使用 C++11 编译器的构造函数继承正在生成错误
- 如果我使用c++11功能编译一个文件,同时将其链接到一个没有c++11编译器选项编译的库,会有什么问题吗
- GoogleNaCl是否支持C++11编译器的异常
- 无限循环的"for(;;)"习语是否正确归因于 PDP-11 C 编译器?
- 是c++ 11编译器内联的std::函数
- windows的c++ 11编译器
- 为什么我不能在代码块 12.11 编译器中使用clock_t?
- C++11 "auto"到非 C++11 编译器
- c++ 11编译器:最接近标准,有多接近
- 在c++11编译器中有一个额外的限定错误
- C++11编译器何时会使RVO和NRVO优于移动语义和常量引用绑定
- C++11 编译器错误,后跟 decltype(var) 后跟内部类型的"var"