Как понять и исправить ошибку создания рекурсивного шаблона с помощью boost ublas?

Я получаю сообщение об ошибке компилятора

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

из clang ++ или неопределенной компиляции с использованием> 10 ГБ памяти из g ++ 4.2.1.

Я пытаюсь создать вспомогательную функцию, которая вычитает скаляр из каждого элемента вектора. Подумав в общих чертах сначала, я планировал иметь определенный тип векторного хранилища в качестве параметра шаблона. При этом, я понимаю, что я не знаю, как заставить определение работать для обоих ublas а также std векторы в этой точке (без специализации). Но мне все еще интересно, что происходит / причина моих проблем с компиляцией?

Проблема легко демонстрируется с помощью приведенного ниже кода, когда соблюдается библиотека 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;
}

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>>>()

И так до тех пор, пока компилятор не достигнет максимальной глубины рекурсии экземпляра.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]