#pragma ссылка для функции шаблона

Я использую 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

Спасибо!

1

Решение

Нет необходимости добавлять вашу функцию в LinkDef.h. Просто #include заголовок (или .L ваш класс) и назовите это! Если это не помогло, пожалуйста, отправьте сообщение об ошибке.

0

Другие решения

Других решений пока нет …