[ROOT] STL sort

From: Nicola Amapane (nicola.amapane@cern.ch)
Date: Wed Jul 24 2002 - 12:32:46 MEST


Hi,

I have 2 problems with STL and compiled/interpreted code. 
I tried several different ways, playing with dictionary and LinkDef, but
at the end I can get the same behaviour with the following very simplified
examples which reimplements a sort on a vector<int>.

<file myless.C>
class myless
{

public:
  bool operator()( const int &a, const int &b) {
    return a < b;
  }
};
</file>

<file test.C>

#include "myless.C"
#include <algorithm>
#include <vector>
#include <iostream>

void test()
{
  vector<int> v;
  v.push_back(1);
  v.push_back(3);
  v.push_back(2);
  //  sort(v.begin(),v.end());
  sort(v.begin(),v.end(),myless());
  cout << v[0] << " " << v[1] << " " << v[2] <<endl;
}
</file>


with this example, 
> .L test.C++
> test()

work perfectly, while

> .L test.C 
> test()

gives:

Error: Constructor myless((myless)(141656792)) not found FILE:algo.h
LINE:864
*** Interpreter error recovered ***

I guess this is due to the fact that STL sort is expecting a pointer to 
the operator (or whatever it is) and this cannot be understood by
CINT, so the only way is to compile it?


Now imagine I want to have a compiled function that does the sort for me.


<file mysort.C>
#include <algorithm>
#include <vector>
#include <iostream>

class mysort
{

public:
  static void doSort(vector<int> &vpar)
  {
    sort(vpar.begin(),vpar.end());
  }
};
</file>

this is what I get in a sample session:

root [0] #include <vector>
root [1] vector<int> v
root [2] v.size()
(const unsigned int)0
root [3] .L mysort.C++
Info in <ACLiC>: creating shared library ./mysort_C.so
Class mysort: Streamer() not declared
Class mysort: ShowMembers() not declared
root [4] v.size()      
(const unsigned int)0
root [5] vector<int> v2
root [6] v2.size()     
Error: Can't call vector<int,__malloc_alloc_template<0> >::size() in
current scope FILE:/tmp/filek1D2K9_cint LINE:1
Possible candidates are...
filename       line:size busy function type and name  (in
vector<int,__malloc_alloc_template<0> >)
Error: Symbol v2 is not defined in current scope
FILE:/tmp/filek1D2K9_cint LINE:1
Error: Failed to evaluate v2.size()Possible candidates are...
filename       line:size busy function type and name  
*** Interpreter error recovered ***

i.e. after loading a file that actually instantites a vector<int>,
it is not possible to use it interactively. I guess that this is 
due to the fact that the compiler creates a concrete type out of the
template and this overrides the CINT template.

How can I use a vector both in compiled and interpreted codes?

I could not find useful information in roottalk. I am using version 
3.03.02.

Thanks,
	Nicola

-----------------------------------
Nicola Amapane                                   []=-
INFN +39-011-6707374                             //    _-=__-=
CERN +41-22-7671519                            _/|]    ) ___ \
Mobile/SMS +39-(0)3471411410                  (_) \___/_(___)_|
mailto:nicola.amapane@cern.ch                  @          @



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:00 MET