ROOT doesn't recognize iterator over map< int, vector<double> >

Hi! I have a map<int, vector<double>> in a root file and I want to open it and access the vectors inside.

At first, ROOT didn’t seem to recognize the map<int, vector<double>> type, so I added this line in LinkDef.h

#pragma link C++ class map<int, vector<double>>;

And here is my script:

(Bunch of #include)
using namespace std;
void macro_test (  ) {

	TFile *f = new TFile("datafile.root");
	map<int, vector<double>> *MyMap;
	TTree *T = (TTree*)f->Get("SomeData");
	cout << (*MyMap).size <<endl ; //size is correctly printed 
	for(map<int, vector<double> >::iterator it = (*MyMap).begin();  it != (*MyMap).end(); ++it) {
	    cout << it->first << " ";

	cout << endl;


But then I get this error :

Error: Symbol it is not defined in current scope  macro_test.C
Error: Failed to evaluate it->first

I also tried using (*it).first but I got the same result. It seems that the iterator itself doesn’t exist, but the loop runs correctly if I print a simple statement like cout << "Loop iteration works! << endl;".

Thanks a lot,

Which version of ROOT are you using?
Did you load the library containing the dictionary corresponding to the modified LinkDef file?


I’m using ROOT 5.34. And you’re right, I forgot to load the library using gSystem->Load("").

I’ve added this command but then I got the following error, which makes no sense to me :

Error: operator== not defined for map<int,vector<double,allocator<double> >,less<int>,allocator<pair<const int,vector<double,allocator<double> > > > >::iteratorError: operator== not defined for map<int,vector<double,allocator<double> >,less<int>,allocator<pair<const int,vector<double,allocator<double> > > > >::iterator function.h:33:
Error: non class,struct,union object it used with . or -> 
Error: << Illegal operator for pointer 3

Then I thought maybe I need to define the iterator as well as the map in the LinkDef, so I added #pragma link C++ class map<int, vector<double>>::iterator; but then I got the same error as in my first post (Symbol it is not defined).

You also need to generate the dictionary for the operators.

#pragma link C++ operators map<int, vector<double>>;
#pragma link C++ operator map<int, vector<double>>::iterator; 
#pragma link C++ operator map<int, vector<double>>::const_iterator;
#pragma link C++ operator map<int, vector<double>>::reverse_iterator;


This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.