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.