【问题标题】:How should I do this template function explicit instantiation for DLL use?我应该如何为 DLL 使用这个模板函数显式实例化?
【发布时间】:2010-11-09 08:43:38
【问题描述】:

我有以下类和模板函数:

template <size_t num>
class String{
 public:
  char charArray[num];
};

template <size_t num,typename T>
void getString(String<num> & string,T number){
 cout <<string.charArray<<' '<<number<<'\n';
}

然后我尝试执行如下显式实例化以将该实例化导出到 DLL,但最后发现它根本没有被实例化,因为我在我的地方得到了链接器未解析的外部符号的链接器错误即将导入并使用该函数(确切的链接器错误:“未解析的外部符号”__declspec(dllimport) void _cdecl getString(class String &,unsigned char) (_imp_??$getString@$04@@YAXAAV?$String@$04@@E@Z)") 因为在我打算实例化的点上没有指定“num”;首先我想可能是因为String&lt;num&gt; &amp; string 将被实现为指针,所以下面的语法将是一个实例化,但似乎我错了。

template<size_t num> 
__declspec(dllexport) void getString(String<num> & string,unsigned char number);

现在你建议我应该如何进行实例化,因为我肯定不会为地球上找到的每一个整数都这样做!!!。

【问题讨论】:

  • 你的问题不是很清楚。您只想为某些参数实例化模板,还是希望能够为 any 参数实例化它?
  • @Oli Charlesworth_As 我打算使用 DLL 的实例化,我必须对某些类型进行显式实例化。
  • @Pooria:不一定是这样。没有任何内容表明您不能将模板放入 DLL 的头文件中。
  • @Oli Charlesworth_关键是要隐藏在这种情况下似乎不可能的实现,否则为什么要使用 DLL?
  • @Pooria:DLL 的目的不是“隐藏实现”,尽管在某些情况下它可以用来做到这一点。

标签: c++ dll export instantiation explicit


【解决方案1】:

如果它是一个您希望能够为任意参数实例化的函数模板,那么不要将它放在您的源文件中。而是放在头文件中。

必填链接:

【讨论】:

  • _重点是隐藏实现,这在这种情况下似乎是不可能的,否则为什么要使用 DLL?
  • @Pooria:模板在编译时转换为源代码。如果您将模板“隐藏”在 DLL 中,那么编译器在编译客户端可执行文件时将无法看到它。
  • _感谢我的这个问题我写了答案(stackoverflow.com/questions/4133307/…)看看。
【解决方案2】:

它是什么,从一开始就是一个错误的设计,我所做的根本不是显式实例化,因为即使对于“size_t num”的不同值,函数的不同实例也会与我的想法相反起初,这种设计是不可能实现我这种预期的显式实例化的。对于正确的设计,函数的第一个参数应该是一个数组,以使“typename T”的不同类型的显式实例化成为可能。正确的设计如下:

template <typename T>
void getString(char string[],T number){
 cout <<string<<' '<<number<<'\n';
}
template __declspec(dllexport) void getString(char string[],unsigned char number);

【讨论】:

    【解决方案3】:

    在你的标题中声明:

    template <size_t num,typename T>
    void getString(String<num> & string,T number);
    

    在你的 cpp 文件中定义:

    template <>
    void getString<42,int>(String<42,int> & string, int number){
      cout <<string.charArray<<' '<<number<<'\n';
    }
    

    【讨论】:

    • @Pooria:因为您需要填写 all 模板参数以进行显式实例化,而我不知道您需要哪些数字。未指定 std::size_t 将需要部分特化,这不适用于函数模板。
    • @sbi_我写了答案感谢我的这个问题(stackoverflow.com/questions/4133307/…)看看。
    猜你喜欢
    • 2012-02-11
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 2014-02-26
    • 2011-10-07
    • 1970-01-01
    相关资源
    最近更新 更多