Я использую 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 в аргументах, но второй имеет тот же список аргументов и имеет возвращаемый тип другого типа.
У вас есть идеи?
В дополнение к обсуждению с Акселем:
Давайте посмотрим на примеры:
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
Но если я буду использовать только include, я не смогу увидеть свою функцию в любом случае:
root [0] #include "MyClass.h"
root [1] MyClass::
MyClass
operator=
~MyClass
Спасибо!