具体的模板正文,它在 dll 中并在客户端中调用



我正在从客户端调用dll中的模板方法,我试图了解dll是否在链接器时链接,那么为什么编译器不抱怨函数体丢失或在客户端调用的范围内找不到。请查看下面的代码。

///Template function body in dll
#include <iostream>
using namespace std;
template <class T>
T add(T _x,T _y)
{
return _x +_y;
}
///client code
#include <iostream>
#include "add.h"
using namespace std;
int main()
{
///Calling template method from client
cout<<add(10,20)<<endl;
}

我试图了解编译器如何在 dll 中找到 add(10,20( 的主体,该主体在链接器期间链接。

我试图了解编译器如何在 add(10,20( 中找到正文 DLL,在链接器期间链接。

其实不然。您会惊讶地发现您的 DLL 完全是空的。你看,模板实际上并不存在。这只是C++编译器丰富想象力的虚构。

模板只是,...一个模板。这不是真正的代码。

模板只有在实际使用或实例化时才会变得真实。在这种情况下,您的模板会在您的main()中实例化。此时,模板代码将弹出,因为编译器实际上使用T=int作为模板参数编译此模板实例的代码。

模板本身就是假的和虚构的。在你弄清楚T是什么(在你的情况下(之前,你不可能知道它们是什么"代码"。可能是int.可能是char.它可能是一个包含数百个方法的庞大类,以及一个重载的+运算符。每种情况都会导致完全不同的代码。

话虽如此:有一些特定于编译器的方法可以指示编译器为模板的特定实例生成代码。在这种情况下,可以指示编译器生成add<int>实例并用它创建 DLL。然后你的DLL将有真正的代码,但只用于add<int>,而不是add<double>,或任何其他添加。

然后,当编译main编译器仍将生成add<int>的代码,但在链接时,链接器将优化add<int>的重复实例,并替换为DLL中的实例。

最新更新