Hi Richard,

but when I try to compile this program

#include <ginac/ginac.h>
using namespace GiNaC;

int main(int argc, char** argv)
{
       exprseq seq{1,2,3};
       seq.prepend(0);
       return 0;
}

I get error:

In file included from /usr/include/ginac/lst.h:26,
                from /usr/include/ginac/normal.h:29,
                from /usr/include/ginac/ginac.h:31,
                from test.cpp:24:
/usr/include/ginac/container.h: In instantiation of ‘GiNaC::container<C>& GiNaC::container< <template-parameter-1-1> >::prepend(const GiNaC::ex&) [with C = std::vector]’:
test.cpp:30:15:   required from here
/usr/include/ginac/container.h:551:12: error: ‘GiNaC::container_storage<std::vector>::STLT’ {aka ‘class std::vector<GiNaC::ex>’} has no member named ‘push_front’
 551 |  this->seq.push_front(b);
     |  ~~~~~~~~~~^~~~~~~~~~

Why not change the code of prepend() in container.h to use insert() instead of push_front()? Then I think it will work for all STL containers.

Jan

Am 02.03.22 um 23:44 schrieb Richard B. Kreckel:
Hi Jan,

On 02.03.22 18:55, Jan Rheinländer wrote:
sometimes GiNaCs templates are a mystery to me. In container.h there is
the code

template<template<classT, class= std::allocator<T>> classC>
container<C> & container<C>::prepend(constex & b)
{
       ensure_if_modifiable();
       this->seq.push_front(b);
       return*this;
}

but AFAIK the STL does not have any push_front() method. And GiNaC does
not seem to define it either. How can this work?

Same applies for pop_front() and sort()

voidsort_(std::input_iterator_tag)
       {
               this->seq.sort(ex_is_less());
       }
Well, not every STL container provides every possible method.
But the standard does require the ones you mention for the instantiated
template classes. Check again!

  -richy.