#pragma ссылка для функции шаблона - PullRequest
0 голосов
/ 01 мая 2018

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

0 голосов
/ 02 мая 2018

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

...