Я использую 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
Спасибо!
Нет необходимости добавлять вашу функцию в LinkDef.h. Просто #include
заголовок (или .L
ваш класс) и назовите это! Если это не помогло, пожалуйста, отправьте сообщение об ошибке.
Других решений пока нет …