如何为类生成字典(vector <vector <short>&gt;)

时间:2016-06-01 10:59:11

标签: c++ dictionary stl makefile root-framework

我有一个简单的代码,我用C ++编写并使用make编译它。 编译时我没有收到错误。但是当我运行它时,我收到std::vector< std::vector<short> >引起的错误,请参见下面的错误:

  

<TTree::SetBranchAddress>出错:无法确定&#34; apv_q&#34;的地址类型。期望的类(vector<vector<short> >)引用stl集合,并且没有已编译的CollectionProxy。请为此课程生成字典(vector<vector<short> >

TTree::SetBranchAddress是来自CERN-ROOT框架的方法

apv_q定义为std::vector< std::vector<short> > *apv_q;

我不熟悉生成词典,所以我在线搜索并找到了在头文件中添加以下行的建议

 #ifdef __MAKECINT__
 #pragma link C++ class vector<short> +;
 #pragma link C++ class vector<vector<short> >+;
 #endif

但它不起作用!

所以我需要你的帮助来解决这个问题,请帮忙!

提前多多感谢!

干杯,

江田

如果相关,下面是我的MakeFile:

      CONFIG=root-config
      CXXFLAGS=$(shell $(CONFIG) --cflags)
      LIBS=$(shell $(CONFIG) --glibs)
      LDFLAGS=$(shell $(CONFIG) --ldflags)
      CXX=g++
      ADDCXXFLAGS=-ggdb -O0 -std=c++0x

      HDRS= ./Settings.h ./HitMaker.h

      HITMAKEROBJS=   HitMaker.o

      all: hitmaker

      hitmaker: $(HITMAKEROBJS)
              $(CXX) -o $@ $(CXXFLAGS) $(ADDCXXFLAGS) $(HITMAKEROBJS) $(LDFLAGS) $(LIBS)

      %.o: %.cc $(HDRS)
              $(CXX) $(CXXFLAGS) $(ADDCXXFLAGS) -c $< 

1 个答案:

答案 0 :(得分:1)

您必须运行root-cint并为其提供一个头文件列表,包括包含行的LinkDef.h

#pragma link C++ class vector<short> +;
#pragma link C++ class vector<vector<short> >+;

然后,此工具会创建一个源文件,您可以编译该文件并链接到您的项目。

您可能希望在Makefile中包含此任务,如果您想使用CMake,可以使用一些宏(搜索FindRoot.cmake,这包括宏ROOT_GENERATE_DICTIONARY)。

编辑:当我运行

时,它适用于我
rootcint -f bla.cc -c HitMaker.h LinkDef.h

并添加Makefile

HITMAKEROBJS=HitMaker.o bla.o

我用

创建了一个根文件
TFile file("test.root", "RECREATE");
TTree tree("tree", "treetitle");
std::vector<std::vector<short>> test;
std::vector<short> test2;
test2.push_back(1);
test.push_back(test2);
tree.Branch("test", &test);
tree.Fill();
tree.Write();

并用

读回来
TFile file("test.root");
TTree* t= NULL;
file.GetObject("tree", t);
std::vector<std::vector<short>>* test = NULL;
t->SetBranchAddress("test", &test);
t->GetEvent(0);
std::cout << test->front().front() << std::endl;

将值1写入stdout。