我使用cling并希望看到我的模板在环境中运行,所以在加载(.L)我的类之后,我希望能够调用我的模板函数。
我可以为这样的模板做到这一点:
template <typename T>
static void ObjectApplyStyle(const char* styleName, T *cObj, Int_t objNum=0, Int_t verbose=0);
对于这样的功能,我在LinkDef.h文件中添加了下一个字符串:
#pragma link C++ function AliDrawStyle::ObjectApplyStyle(const char*, TGraph *, Int_t, Int_t);
#pragma link C++ function AliDrawStyle::ObjectApplyStyle(const char*, TH1 *, Int_t, Int_t);
#pragma link C++ function AliDrawStyle::ObjectApplyStyle(const char*, TF1 *, Int_t, Int_t);
所以我的问题是如何才能做到这一点,但对于这样的模板功能呢?
template <typename T>
static T PrepareValue(const char* styleName, TString propertyName, TString elementID, TString classID, TString objectID, TString localStyle, Bool_t &status, Int_t objNum=0, Int_t verbose=0);
如果我将在LinkDef.h中添加此字符串:
#pragma link C++ function <Int_t> AliDrawStyle::PrepareValue(const char*, TString, TString, TString, TString, TString, Bool_t &, Int_t, Int_t);
#pragma link C++ function <Float_t> AliDrawStyle::PrepareValue(const char*, TString, TString, TString, TString, TString, Bool_t &, Int_t, Int_t);
编译器给我警告“func not found”。
正如你在这里看到我的模板函数之间的区别 - 第一个在参数中包含T类型,但第二个具有相同的参数列表并且具有不同类型的返回值。
你有什么想法吗?
除了与Axel讨论之外:
让我们看看例子:
MyClass.h
class MyClass {
public:
template <typename T>
static T Ex1();
template <typename T>
static T Ex2();
};
MyClass.cxx
#include "MyClass.h"
template <typename T>
T MyClass::Ex1(){
}
template <typename T>
T MyClass::Ex2(){
}
这就是我在root6中看到的:
root [0] #include "MyClass.h"
root [1] MyClass::
MyClass
operator=
~MyClass
root [1] MyClass::
同样的.L
root [0] .L MyClass.cxx+
root [1] MyClass::
MyClass
operator=
~MyClass
root [1] MyClass::
但是如果我添加一个函数的显式调用: 的 MyClass.cxx
#include "MyClass.h"
template <typename T>
T MyClass::Ex1(){
// here I added calling of template function
MyClass::Ex2<float>();
}
template <typename T>
T MyClass::Ex2(){
}
我将开始看到:
root [0] .L MyClass.cxx+
root [1] MyClass::
Ex2<float>
MyClass
operator=
~MyClass
root [1] .q
但如果我只使用包括我无法看到我的函数:
root [0] #include "MyClass.h"
root [1] MyClass::
MyClass
operator=
~MyClass
谢谢!
答案 0 :(得分:0)
无需将您的函数添加到LinkDef.h。只需#include
标题(或.L
您的类)并调用它!如果失败,请发布错误消息。