如何为 class (vector<vector<short> >) 生成字典
How to generate a dictionary for the class (vector<vector<short> >)
我有一段用 C++ 编写并使用 make 编译的简单代码。
我编译时没有出错。但是当我 运行 它时,我得到一个由 std::vector< std::vector<short> >
引起的错误,见下面的错误:
Error in <TTree::SetBranchAddress>
: Unable to determine the type given for the address for "apv_q". The class expected (vector<vector<short> >
) refers to an stl collection and do not have a compiled CollectionProxy. Please generate the dictionary for this class (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 $<
你必须 运行 root-cint
并给它一个你的头文件列表,包括 LinkDef.h
其中包含行
#pragma link C++ class vector<short> +;
#pragma link C++ class vector<vector<short> >+;
此工具随后会创建一个源文件,您可以将其编译并 link 到您的项目中。
您可能希望将此任务包含在您的 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
被写入标准输出。
我有一段用 C++ 编写并使用 make 编译的简单代码。
我编译时没有出错。但是当我 运行 它时,我得到一个由 std::vector< std::vector<short> >
引起的错误,见下面的错误:
Error in
<TTree::SetBranchAddress>
: Unable to determine the type given for the address for "apv_q". The class expected (vector<vector<short> >
) refers to an stl collection and do not have a compiled CollectionProxy. Please generate the dictionary for this class (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 $<
你必须 运行 root-cint
并给它一个你的头文件列表,包括 LinkDef.h
其中包含行
#pragma link C++ class vector<short> +;
#pragma link C++ class vector<vector<short> >+;
此工具随后会创建一个源文件,您可以将其编译并 link 到您的项目中。
您可能希望将此任务包含在您的 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
被写入标准输出。