Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在dll中存在并在客户机中调用的具体模板体_C++ - Fatal编程技术网

C++ 在dll中存在并在客户机中调用的具体模板体

C++ 在dll中存在并在客户机中调用的具体模板体,c++,C++,我正在从客户机调用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

我正在从客户机调用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中的模板函数体
#包括
使用名称空间std;
模板
T加(T_x,T_y)
{
返回x+\y;
}
///客户端代码
#包括
#包括“add.h”
使用名称空间std;
int main()
{
///从客户端调用模板方法
库特
我试图理解编译器是如何在中查找add(10,20)的主体的
在链接器时间内链接的dll

不知道。你会惊讶地发现你的DLL是完全空的。你看,一个模板并不真正存在。它只是你C++编译器丰富想象力的一个图形。< / P> 模板只是一个模板,它不是真正的代码

模板只有在实际使用时才会变为现实,或者在实例化时才会变为现实
。此时,模板代码突然出现,因为编译器实际使用
T=int
作为模板参数编译此模板的实例的代码

模板本身是假的和虚构的。在你搞清楚
T
是什么之前,你不可能知道它们是什么“代码”(在你的例子中)。它可能是
int
。它可能是
char
。它可能是一个包含数百个方法的大型类,以及一个重载的
+
运算符。每种情况都会产生完全不同的代码

话虽如此:有一些特定于编译器的方法可以指示编译器为模板的特定实例生成代码。在这种情况下,您可以指示编译器生成
add
的实例,并从中生成一个DLL。这样,您的DLL将具有真正的代码,但仅用于
add
,而不是
add
,或任何其他添加项


然后,在编译
main
时,编译器仍将生成
add
的代码,但在链接时,
add
的重复实例将被链接器优化掉,并替换为来自DLL的实例。

实际上,DLL实例永远不会在客户端的链接中使用,除非它们已被expor在此之前,所有模板实例都将使用非dll。