C++11 boost::odeint my_vector.cpp示例中的分段错误

C++11 boost::odeint my_vector.cpp示例中的分段错误,c++11,boost,odeint,C++11,Boost,Odeint,我试图从boost::odeint示例中测试my_vector.cpp程序,但没有成功。我在运行程序时遇到了分段错误。 编译:g++-std=c++14-o my_vector my_vector.cpp 对于state\u类型,它使用std::vector而不是my\u vector运行。我怀疑它的大小有问题,但我不知道如何修复它 这是my_vector.cpp的代码,您可以从 /* *版权所有2011-2012马里奥·穆兰斯基 *版权所有2012-2013 Karsten Ahnert *

我试图从boost::odeint示例中测试my_vector.cpp程序,但没有成功。我在运行程序时遇到了分段错误。 编译:g++-std=c++14-o my_vector my_vector.cpp

对于state\u类型,它使用std::vector而不是my\u vector运行。我怀疑它的大小有问题,但我不知道如何修复它

这是my_vector.cpp的代码,您可以从

/*
*版权所有2011-2012马里奥·穆兰斯基
*版权所有2012-2013 Karsten Ahnert
*
*根据Boost软件许可证1.0版发布。
*(请参阅随附的文件LICENSE_1_0.txt或
*抄袭http://www.boost.org/LICENSE_1_0.txt)
*
*自定义向量类型的示例。
*/
#包括
#包括
//[my_向量
模板
给我的向量分类
{
typedef std::vectorvector;
公众:
typedef向量::迭代器迭代器;
typedef向量::常量迭代器常量迭代器;
公众:
我的向量(常量大小)
:m_v(N)
{ 
m_v.储量(最大值);
}
我的向量()
:m_v()
{
m_v.储量(最大值);
}
//…[实现容器接口]
//]
常数双值和运算符[](常数大小)常数
{返回m_v[n];}
双运算符(&O)[](常量大小\u t n)
{返回m_v[n];}
迭代器begin()
{返回m_v.begin();}
常量迭代器begin()常量
{返回m_v.begin();}
迭代器结束()
{返回m_v.end();}
常量迭代器end()常量
{返回m_v.end();}
大小\u t大小()常量
{返回m_v.size();}
空心调整大小(常量大小\u t n)
{m_v.resize(n);}
私人:
标准::向量m_v;
};
//[my_vector_可调整大小
//将我的_向量定义为可调整大小
名称空间boost{名称空间数值{名称空间odeint{
模板
结构可调整大小<我的向量>
{
typedef boost::true_类型;
静态常量布尔值=类型::值;
};
} } }
//]
类型定义我的向量状态类型;
void lorenz(常数状态类型&x,状态类型&dxdt,常数双t)
{
恒双西格玛(10.0);
常数双R(28.0);
常数双b(8.0/3.0);
dxdt[0]=sigma*(x[1]-x[0]);
dxdt[1]=R*x[0]-x[1]-x[0]*x[2];
dxdt[2]=-b*x[2]+x[0]*x[1];
}
使用名称空间boost::numeric::odeint;
int main()
{
状态_类型x(3);
x[0]=5.0;x[1]=10.0;x[2]=10.0;
//我的_向量在实现时与range_代数一起工作
//容器接口的必需部分
//不需要进一步的工作
积分常数(runge_kutta4(),lorenz,x,0.0,10.0,0.1);
}

我可以用g++-4.8重现这一点

我在odeint github存储库中发现了一个问题:

编辑:

我发现了问题并解决了它:

问题在于模板参数类型不一致,这使得可调整大小的定义无法正常工作,正如op所期望的那样

将my_u向量模板参数类型更改为size_ut可修复此问题:

template<size_t N>
class my_vector
模板
给我的向量分类

我使用的是g++4.9.3和boost 1.54.0,我仍然认为调试断言/.at()的用法是正确的,因为这种类型的破坏很容易被忽略。@sehe:同意,我添加了一个编译时检查,确保在示例中启用了调整大小功能。我认为在这种情况下,这是一种很好的做法:
template<size_t N>
class my_vector