c++ - #pragma 链接模板函数

标签 c++ templates pragma cling

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

但是如果我只使用 include 无论如何我都看不到我的函数:

root [0] #include "MyClass.h"
root [1] MyClass::
MyClass
operator=
~MyClass

谢谢!

最佳答案

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

关于c++ - #pragma 链接模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50121515/

相关文章:

.net - NVelocity 项目死了吗?有替代品吗?

c - 如何在库本身不冲突的情况下强制链接器拒绝特定库?

c - 在不使用 pragma 的情况下禁用 C 中的结构填充

c++ - 调用 boolean 函数但出现错误 "no matching function to call"?

c++ - 两个对象似乎共享同一个地址

C++ 程序报告找不到符号错误

c++ - 如何防止隐式转换为具有多种整数类型的 boost::variant 类型?

python - python中的编译指示

c++ - 访问和修改另一个线程堆栈上的自动变量

c++ - 优化器何时可以组合对成员函数的调用?