我有一个简单的代码,我用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 $<
答案 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。