【问题标题】:#pragma link for template function模板函数的#pragma 链接
【发布时间】:2018-05-01 18:07:55
【问题描述】:

我使用 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);

编译器给我警告“找不到函数”。

你可以在这里看到我的模板函数之间的区别 - 第一个包含 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

谢谢!

【问题讨论】:

  • 对于坚持我的问​​题没有意义。只需一件事即可将您的功能添加到环境中。它应该在您的代码中使用,在这种情况下,您的函数将被自动添加。但在这种情况下,问题仍然悬而未决,因为我现在如何为 cint 做同样的事情?
  • 在 linkdef 中,您应该为我的情况添加以下字符串:#pragma link C++ function AliDrawStyle::PrepareValue; #pragma link C++ 函数 AliDrawStyle::PrepareValue;

标签: c++ templates pragma cling


【解决方案1】:

无需将您的函数添加到 LinkDef.h。只需#include 标题(或.L 你的班级)并调用它!如果失败,请发布错误消息。

【讨论】:

  • 阿克塞尔,感谢您的回复。嗯……对不起,我不太明白你的意思。所以,我的类有接口(.h)和实现(.cxx),在我的头文件中我有模板静态函数的定义,在.cxx中我有它的实现,我应该在#include中添加什么? /跨度>
  • Cling 不使用Linkdef.h 文件。在紧贴提示符下,执行#include "MyClass.h",您将能够调用任何函数,甚至是模板函数的特化。为了取得进展,我们需要知道您输入的内容(确切地说,如复制和粘贴)以及您收到的错误消息(确切地说,如复制和粘贴)。
猜你喜欢
  • 1970-01-01
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多