gpt4 book ai didi

c++ - 如何使用 boost ublas 理解和修复递归模板实例化错误?

转载 作者:行者123 更新时间:2023-11-28 07:46:17 25 4
gpt4 key购买 nike

我收到一个编译器错误

/Developer/boost/boost/numeric/ublas/expression_types.hpp:184:16: fatal error: recursive template instantiation exceeded maximum depth of 512

来自 clang++ 或来自 g++ 4.2.1 的 >10GB 内存使用的无限期编译。

我正在尝试创建一个辅助函数,用于从 vector 的每个元素中减去一个标量。起初考虑一般,我计划将特定 vector 存储类型作为模板参数。话虽如此,我意识到此时我不知道如何使定义同时适用于 ublasstd vector (没有专门化)。但我仍然想知道发生了什么/编译问题的原因?

当与 boost 库兼容时,问题很容易用下面的代码演示,例如g++ -I/path/boost bug_demo.cpp

boost 或我的代码中是否存在错误?

// demo code does not compiler, instead error for recursive template instantiation
//---------------------------------------------------------

#include <boost/numeric/ublas/vector.hpp>

namespace ublas = boost::numeric::ublas; // boost ublas will be the implementation for basic vector container
typedef ublas::vector<double> DVEC; // double vector shorthand

// ********* problem function ***********
template <typename vec_t, typename scalar_t>
vec_t operator-( const vec_t & vec, scalar_t scalar )
{
ublas::scalar_vector<scalar_t> scalar_v(vec.size(), scalar);
return vec - scalar_v;
}

// this non-template version works fine.
/* DVEC operator-( const DVEC & vec, double scalar )
{
ublas::scalar_vector<double> scalar_v(vec.size(), scalar);
return vec - scalar_v;
}
*/

DVEC vectorFunc( const DVEC& x )
{
double bnew=0.0;
DVEC x_bnew;
x_bnew = operator-(x,bnew);
return x_bnew;
}

int main()
{
DVEC inputVector(2);
inputVector[0] = 1.0; inputVector[1] = 2.0;

DVEC output = vectorFunc( inputVector );
return 0;
}

最佳答案

你的 operator - ()函数正在通过在执行 vec - scalar_v 时调用自身来设置无限模板实例化递归.虽然参数类型的名字是scalar_t ,这只是一个名称,它可以匹配任何类型,包括 scalar_vector<scalar_t> .

因此,行 xbnew = operator - (x, bnew)将导致实例化:

operator - <DVEC, double>()

该运算符模板中的最后一行将依次导致实例化:

operator - <DVEC, scalar_vector<double>>()

然后,同一运算符模板中的最后一行将导致实例化:

operator - <DVEC, scalar_vector<scalar_vector<double>>>()

依此类推,直到编译器达到最大实例化递归深度。

关于c++ - 如何使用 boost ublas 理解和修复递归模板实例化错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14821686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com