Linux静态链接库与模板类的处理方式
<p>在阅读本文之前,小编先给大家介绍一篇相关文章:linux静态链接库使用类模板的快速排序算法</p>
<p>
大家首先看下以上的文章对理解下面的知识点会有很大的帮助。</p>
<p>
当模板遇到静态链接库会发生什么呢。</p>
<p>
我们先按照常规思路去考虑一个静态链接库的步骤:</p>
<p>
1.将某些功能提取出来,放进一个cpp文件,并将接口或者对外导出的类放在头文件中</p>
<p>
2.gcc -c编译该文件,生成.o</p>
<p>
3.ar命令将.o文件打包成.a,即静态链接库</p>
<p>
4.编译main函数,并将该静态链接库链接,生成可执行文件。</p>
<p>
ok,按照这个思路,我们将之前写的快速排序代码修改后,如下:</p>
<p>
lib_test.h:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterxhtml" id="highlighter_366999">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="xhtml plain">//lib_test.h</code>
</div>
<div class="line number2 index1 alt1">
<code class="xhtml plain">//head file of quick sort</code>
</div>
<div class="line number3 index2 alt2">
<code class="xhtml plain">//users should realise operator > and <</code>
</div>
<div class="line number4 index3 alt1">
<code class="xhtml plain">#ifndef lib_test_h</code>
</div>
<div class="line number5 index4 alt2">
<code class="xhtml plain">#define lib_test_h</code>
</div>
<div class="line number6 index5 alt1">
<code class="xhtml plain">template<</code><code class="xhtml keyword">class</code> <code class="xhtml plain">t></code>
</div>
<div class="line number7 index6 alt2">
<code class="xhtml plain">class sort</code>
</div>
<div class="line number8 index7 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number9 index8 alt2">
<code class="xhtml plain">public:</code>
</div>
<div class="line number10 index9 alt1">
<code class="xhtml plain">static void myqsort(t a[], int p, int r);</code>
</div>
<div class="line number11 index10 alt2">
<code class="xhtml plain">static void myqsortnorecur(t a[], int p, int r);</code>
</div>
<div class="line number12 index11 alt1">
<code class="xhtml plain">private:</code>
</div>
<div class="line number13 index12 alt2">
<code class="xhtml plain">static int partition(t a[], int p, int r);</code>
</div>
<div class="line number14 index13 alt1">
<code class="xhtml plain">static void exchange(t a[], int i, int j);</code>
</div>
<div class="line number15 index14 alt2">
</div>
<div class="line number16 index15 alt1">
<code class="xhtml plain">};</code>
</div>
<div class="line number17 index16 alt2">
</div>
<div class="line number18 index17 alt1">
<code class="xhtml plain">#endif</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
lib_test.cc:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightercpp" id="highlighter_46929">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
<div class="line number23 index22 alt2">
23</div>
<div class="line number24 index23 alt1">
24</div>
<div class="line number25 index24 alt2">
25</div>
<div class="line number26 index25 alt1">
26</div>
<div class="line number27 index26 alt2">
27</div>
<div class="line number28 index27 alt1">
28</div>
<div class="line number29 index28 alt2">
29</div>
<div class="line number30 index29 alt1">
30</div>
<div class="line number31 index30 alt2">
31</div>
<div class="line number32 index31 alt1">
32</div>
<div class="line number33 index32 alt2">
33</div>
<div class="line number34 index33 alt1">
34</div>
<div class="line number35 index34 alt2">
35</div>
<div class="line number36 index35 alt1">
36</div>
<div class="line number37 index36 alt2">
37</div>
<div class="line number38 index37 alt1">
38</div>
<div class="line number39 index38 alt2">
39</div>
<div class="line number40 index39 alt1">
40</div>
<div class="line number41 index40 alt2">
41</div>
<div class="line number42 index41 alt1">
42</div>
<div class="line number43 index42 alt2">
43</div>
<div class="line number44 index43 alt1">
44</div>
<div class="line number45 index44 alt2">
45</div>
<div class="line number46 index45 alt1">
46</div>
<div class="line number47 index46 alt2">
47</div>
<div class="line number48 index47 alt1">
48</div>
<div class="line number49 index48 alt2">
49</div>
<div class="line number50 index49 alt1">
50</div>
<div class="line number51 index50 alt2">
51</div>
<div class="line number52 index51 alt1">
52</div>
<div class="line number53 index52 alt2">
53</div>
<div class="line number54 index53 alt1">
54</div>
<div class="line number55 index54 alt2">
55</div>
<div class="line number56 index55 alt1">
56</div>
<div class="line number57 index56 alt2">
57</div>
<div class="line number58 index57 alt1">
58</div>
<div class="line number59 index58 alt2">
59</div>
<div class="line number60 index59 alt1">
60</div>
<div class="line number61 index60 alt2">
61</div>
<div class="line number62 index61 alt1">
62</div>
<div class="line number63 index62 alt2">
63</div>
<div class="line number64 index63 alt1">
64</div>
<div class="line number65 index64 alt2">
65</div>
<div class="line number66 index65 alt1">
66</div>
<div class="line number67 index66 alt2">
67</div>
<div class="line number68 index67 alt1">
68</div>
<div class="line number69 index68 alt2">
69</div>
<div class="line number70 index69 alt1">
70</div>
<div class="line number71 index70 alt2">
71</div>
<div class="line number72 index71 alt1">
72</div>
<div class="line number73 index72 alt2">
73</div>
<div class="line number74 index73 alt1">
74</div>
<div class="line number75 index74 alt2">
75</div>
<div class="line number76 index75 alt1">
76</div>
<div class="line number77 index76 alt2">
77</div>
<div class="line number78 index77 alt1">
78</div>
<div class="line number79 index78 alt2">
79</div>
<div class="line number80 index79 alt1">
80</div>
<div class="line number81 index80 alt2">
81</div>
<div class="line number82 index81 alt1">
82</div>
<div class="line number83 index82 alt2">
83</div>
<div class="line number84 index83 alt1">
84</div>
<div class="line number85 index84 alt2">
85</div>
<div class="line number86 index85 alt1">
86</div>
<div class="line number87 index86 alt2">
87</div>
<div class="line number88 index87 alt1">
88</div>
<div class="line number89 index88 alt2">
89</div>
<div class="line number90 index89 alt1">
90</div>
<div class="line number91 index90 alt2">
91</div>
<div class="line number92 index91 alt1">
92</div>
<div class="line number93 index92 alt2">
93</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="cpp comments">//lib_test.cc</code>
</div>
<div class="line number2 index1 alt1">
</div>
<div class="line number3 index2 alt2">
<code class="cpp preprocessor">#include <iostream></code>
</div>
<div class="line number4 index3 alt1">
<code class="cpp preprocessor">#include <stack></code>
</div>
<div class="line number5 index4 alt2">
<code class="cpp preprocessor">#include"stdlib.h"</code>
</div>
<div class="line number6 index5 alt1">
<code class="cpp preprocessor">#include <time.h></code>
</div>
<div class="line number7 index6 alt2">
<code class="cpp preprocessor">#include "lib_test.h"</code>
</div>
<div class="line number8 index7 alt1">
</div>
<div class="line number9 index8 alt2">
<code class="cpp keyword bold">using</code> <code class="cpp keyword bold">namespace</code> <code class="cpp plain">std;</code>
</div>
<div class="line number10 index9 alt1">
</div>
<div class="line number11 index10 alt2">
</div>
<div class="line number12 index11 alt1">
</div>
<div class="line number13 index12 alt2">
<code class="cpp keyword bold">template</code><code class="cpp plain"><</code><code class="cpp keyword bold">class</code> <code class="cpp plain">t></code>
</div>
<div class="line number14 index13 alt1">
<code class="cpp keyword bold">void</code> <code class="cpp plain">sort<t>::exchange(t a[], </code><code class="cpp color1 bold">int</code> <code class="cpp plain">i, </code><code class="cpp color1 bold">int</code> <code class="cpp plain">j)</code>
</div>
<div class="line number15 index14 alt2">
<code class="cpp plain">{</code>
</div>
<div class="line number16 index15 alt1">
<code class="cpp plain">t temp = a;</code>
</div>
<div class="line number17 index16 alt2">
<code class="cpp plain">a = a;</code>
</div>
<div class="line number18 index17 alt1">
<code class="cpp plain">a = temp;</code>
</div>
<div class="line number19 index18 alt2">
<code class="cpp keyword bold">return</code><code class="cpp plain">;</code>
</div>
<div class="line number20 index19 alt1">
<code class="cpp plain">}</code>
</div>
<div class="line number21 index20 alt2">
</div>
<div class="line number22 index21 alt1">
<code class="cpp keyword bold">template</code><code class="cpp plain"><</code><code class="cpp keyword bold">class</code> <code class="cpp plain">t></code>
</div>
<div class="line number23 index22 alt2">
<code class="cpp color1 bold">int</code> <code class="cpp plain">sort<t>::partition(t a[],</code><code class="cpp color1 bold">int</code> <code class="cpp plain">p,</code><code class="cpp color1 bold">int</code> <code class="cpp plain">r)</code>
</div>
<div class="line number24 index23 alt1">
<code class="cpp plain">{</code>
</div>
<div class="line number25 index24 alt2">
</div>
<div class="line number26 index25 alt1">
<code class="cpp color1 bold">int</code> <code class="cpp plain">i = p;</code>
</div>
<div class="line number27 index26 alt2">
<code class="cpp color1 bold">int</code> <code class="cpp plain">j = p-1;</code>
</div>
<div class="line number28 index27 alt1">
<code class="cpp plain">t ref = a;</code>
</div>
<div class="line number29 index28 alt2">
<code class="cpp color1 bold">int</code> <code class="cpp plain">refid = p;</code>
</div>
<div class="line number30 index29 alt1">
<code class="cpp functions bold">srand</code><code class="cpp plain">((unsigned)</code><code class="cpp functions bold">time</code><code class="cpp plain">(null));</code>
</div>
<div class="line number31 index30 alt2">
<code class="cpp plain">refid = (</code><code class="cpp functions bold">rand</code><code class="cpp plain">() % (r-p+1))+ p;</code>
</div>
<div class="line number32 index31 alt1">
<code class="cpp comments">//cout<<refid<<endl;</code>
</div>
<div class="line number33 index32 alt2">
<code class="cpp plain">ref = a;</code>
</div>
<div class="line number34 index33 alt1">
<code class="cpp keyword bold">for</code><code class="cpp plain">(; i<=r; i++)</code>
</div>
<div class="line number35 index34 alt2">
<code class="cpp plain">{</code>
</div>
<div class="line number36 index35 alt1">
<code class="cpp keyword bold">if</code><code class="cpp plain">(a < ref)</code>
</div>
<div class="line number37 index36 alt2">
<code class="cpp plain">{</code>
</div>
<div class="line number38 index37 alt1">
<code class="cpp plain">j++;</code>
</div>
<div class="line number39 index38 alt2">
<code class="cpp plain">exchange(a, i, j);</code>
</div>
<div class="line number40 index39 alt1">
<code class="cpp keyword bold">if</code><code class="cpp plain">(j == refid)</code>
</div>
<div class="line number41 index40 alt2">
<code class="cpp plain">{</code>
</div>
<div class="line number42 index41 alt1">
<code class="cpp plain">refid = i;</code>
</div>
<div class="line number43 index42 alt2">
<code class="cpp plain">}</code>
</div>
<div class="line number44 index43 alt1">
<code class="cpp plain">}</code>
</div>
<div class="line number45 index44 alt2">
</div>
<div class="line number46 index45 alt1">
<code class="cpp plain">}</code>
</div>
<div class="line number47 index46 alt2">
<code class="cpp plain">exchange(a, j+1, refid);</code>
</div>
<div class="line number48 index47 alt1">
</div>
<div class="line number49 index48 alt2">
<code class="cpp keyword bold">return</code> <code class="cpp plain">j+1;</code>
</div>
<div class="line number50 index49 alt1">
<code class="cpp plain">}</code>
</div>
<div class="line number51 index50 alt2">
</div>
<div class="line number52 index51 alt1">
<code class="cpp keyword bold">template</code><code class="cpp plain"><</code><code class="cpp keyword bold">class</code> <code class="cpp plain">t></code>
</div>
<div class="line number53 index52 alt2">
<code class="cpp keyword bold">void</code> <code class="cpp plain">sort<t>::myqsort(t a[],</code><code class="cpp color1 bold">int</code> <code class="cpp plain">p,</code><code class="cpp color1 bold">int</code> <code class="cpp plain">r)</code>
</div>
<div class="line number54 index53 alt1">
<code class="cpp plain">{</code>
</div>
<div class="line number55 index54 alt2">
<code class="cpp color1 bold">int</code> <code class="cpp plain">q = 0;</code>
</div>
<div class="line number56 index55 alt1">
<code class="cpp keyword bold">if</code><code class="cpp plain">(p<r)</code>
</div>
<div class="line number57 index56 alt2">
<code class="cpp plain">{</code>
</div>
<div class="line number58 index57 alt1">
<code class="cpp plain">q = partition(a, p, r);</code>
</div>
<div class="line number59 index58 alt2">
<code class="cpp plain">myqsort(a, p, q-1);</code>
</div>
<div class="line number60 index59 alt1">
<code class="cpp plain">myqsort(a, p+1, r);</code>
</div>
<div class="line number61 index60 alt2">
<code class="cpp plain">}</code>
</div>
<div class="line number62 index61 alt1">
</div>
<div class="line number63 index62 alt2">
<code class="cpp keyword bold">return</code><code class="cpp plain">;</code>
</div>
<div class="line number64 index63 alt1">
</div>
<div class="line number65 index64 alt2">
<code class="cpp plain">}</code>
</div>
<div class="line number66 index65 alt1">
</div>
<div class="line number67 index66 alt2">
<code class="cpp keyword bold">template</code><code class="cpp plain"><</code><code class="cpp keyword bold">class</code> <code class="cpp plain">t></code>
</div>
<div class="line number68 index67 alt1">
<code class="cpp keyword bold">void</code> <code class="cpp plain">sort<t>::myqsortnorecur(t a[], </code><code class="cpp color1 bold">int</code> <code class="cpp plain">p, </code><code class="cpp color1 bold">int</code> <code class="cpp plain">r)</code>
</div>
<div class="line number69 index68 alt2">
<code class="cpp plain">{</code>
</div>
<div class="line number70 index69 alt1">
<code class="cpp color1 bold">int</code> <code class="cpp plain">start = p;</code>
</div>
<div class="line number71 index70 alt2">
<code class="cpp color1 bold">int</code> <code class="cpp plain">end = r;</code>
</div>
<div class="line number72 index71 alt1">
<code class="cpp color1 bold">int</code> <code class="cpp plain">mid = 0;</code>
</div>
<div class="line number73 index72 alt2">
<code class="cpp plain">std::stack<</code><code class="cpp color1 bold">int</code><code class="cpp plain">> sortstk;</code>
</div>
<div class="line number74 index73 alt1">
</div>
<div class="line number75 index74 alt2">
<code class="cpp plain">sortstk.push(p);</code>
</div>
<div class="line number76 index75 alt1">
<code class="cpp plain">sortstk.push(r);</code>
</div>
<div class="line number77 index76 alt2">
</div>
<div class="line number78 index77 alt1">
<code class="cpp keyword bold">while</code><code class="cpp plain">(!sortstk.empty())</code>
</div>
<div class="line number79 index78 alt2">
<code class="cpp plain">{</code>
</div>
<div class="line number80 index79 alt1">
<code class="cpp plain">end = sortstk.top();</code>
</div>
<div class="line number81 index80 alt2">
<code class="cpp plain">sortstk.pop();</code>
</div>
<div class="line number82 index81 alt1">
<code class="cpp plain">start = sortstk.top();</code>
</div>
<div class="line number83 index82 alt2">
<code class="cpp plain">sortstk.pop();</code>
</div>
<div class="line number84 index83 alt1">
<code class="cpp keyword bold">if</code><code class="cpp plain">(start < end)</code>
</div>
<div class="line number85 index84 alt2">
<code class="cpp plain">{</code>
</div>
<div class="line number86 index85 alt1">
<code class="cpp plain">mid = partition(a, start, end);</code>
</div>
<div class="line number87 index86 alt2">
<code class="cpp plain">sortstk.push(start);</code>
</div>
<div class="line number88 index87 alt1">
<code class="cpp plain">sortstk.push(mid -1);</code>
</div>
<div class="line number89 index88 alt2">
<code class="cpp plain">sortstk.push(mid + 1);</code>
</div>
<div class="line number90 index89 alt1">
<code class="cpp plain">sortstk.push(end);</code>
</div>
<div class="line number91 index90 alt2">
<code class="cpp plain">}</code>
</div>
<div class="line number92 index91 alt1">
<code class="cpp plain">}</code>
</div>
<div class="line number93 index92 alt2">
<code class="cpp plain">}</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
ok,我们尝试编译.a静态链接库</p>
<p>
<img title="Linux静态链接库与模板类的处理方式" alt="Linux静态链接库与模板类的处理方式" src="https://zhuji.jb51.net/uploads/img/202305/cc9e62109c7bc2c0de592194c5baf414.jpg"></p>
<p>
接下来,只需要将静态链接库编入main函数,就算完成了</p>
<p>
<img title="Linux静态链接库与模板类的处理方式" alt="Linux静态链接库与模板类的处理方式" src="https://zhuji.jb51.net/uploads/img/202305/c8ca7aa7d87a2b088493e50a19a7342d.jpg"></p>
<p>
出问题了,发现我们编译的静态链接库里面居然没有这个myqsortnorecur函数,可是我明明在快速排序这个类sort里面实现了这个函数啊。</p>
<p>
用nm命令看下:</p>
<p>
<img title="Linux静态链接库与模板类的处理方式" alt="Linux静态链接库与模板类的处理方式" src="https://zhuji.jb51.net/uploads/img/202305/b8ca4245bca348639c49e63b81653bf6.jpg"></p>
<p>
实实在在的,符号很少,确实没有我之前写的函数。这就奇怪了,今天下午在网上搜了很久,原来是模板类的原因导致的:</p>
<p>
因为在编译动态链接库中,我们并没有指定template class的type,那么静态链接库中自然不知道按照什么type去编译该class中成员函数。</p>
<p>
参考文献:</p>
<p>
有没有解决办法呢?答案是肯定的,只要我们在静态链接库中申明一个type,并调用该指定type的函数,那么静态链接库中就有函数原型了。</p>
<p>
我觉得可以把该过程称为接口的“实例化”过程........</p>
<p>
现在把lib_test.cc修改如下:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightercpp" id="highlighter_755083">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
<div class="line number23 index22 alt2">
23</div>
<div class="line number24 index23 alt1">
24</div>
<div class="line number25 index24 alt2">
25</div>
<div class="line number26 index25 alt1">
26</div>
<div class="line number27 index26 alt2">
27</div>
<div class="line number28 index27 alt1">
28</div>
<div class="line number29 index28 alt2">
29</div>
<div class="line number30 index29 alt1">
30</div>
<div class="line number31 index30 alt2">
31</div>
<div class="line number32 index31 alt1">
32</div>
<div class="line number33 index32 alt2">
33</div>
<div class="line number34 index33 alt1">
34</div>
<div class="line number35 index34 alt2">
35</div>
<div class="line number36 index35 alt1">
36</div>
<div class="line number37 index36 alt2">
37</div>
<div class="line number38 index37 alt1">
38</div>
<div class="line number39 index38 alt2">
39</div>
<div class="line number40 index39 alt1">
40</div>
<div class="line number41 index40 alt2">
41</div>
<div class="line number42 index41 alt1">
42</div>
<div class="line number43 index42 alt2">
43</div>
<div class="line number44 index43 alt1">
44</div>
<div class="line number45 index44 alt2">
45</div>
<div class="line number46 index45 alt1">
46</div>
<div class="line number47 index46 alt2">
47</div>
<div class="line number48 index47 alt1">
48</div>
<div class="line number49 index48 alt2">
49</div>
<div class="line number50 index49 alt1">
50</div>
<div class="line number51 index50 alt2">
51</div>
<div class="line number52 index51 alt1">
52</div>
<div class="line number53 index52 alt2">
53</div>
<div class="line number54 index53 alt1">
54</div>
<div class="line number55 index54 alt2">
55</div>
<div class="line number56 index55 alt1">
56</div>
<div class="line number57 index56 alt2">
57</div>
<div class="line number58 index57 alt1">
58</div>
<div class="line number59 index58 alt2">
59</div>
<div class="line number60 index59 alt1">
60</div>
<div class="line number61 index60 alt2">
61</div>
<div class="line number62 index61 alt1">
62</div>
<div class="line number63 index62 alt2">
63</div>
<div class="line number64 index63 alt1">
64</div>
<div class="line number65 index64 alt2">
65</div>
<div class="line number66 index65 alt1">
66</div>
<div class="line number67 index66 alt2">
67</div>
<div class="line number68 index67 alt1">
68</div>
<div class="line number69 index68 alt2">
69</div>
<div class="line number70 index69 alt1">
70</div>
<div class="line number71 index70 alt2">
71</div>
<div class="line number72 index71 alt1">
72</div>
<div class="line number73 index72 alt2">
73</div>
<div class="line number74 index73 alt1">
74</div>
<div class="line number75 index74 alt2">
75</div>
<div class="line number76 index75 alt1">
76</div>
<div class="line number77 index76 alt2">
77</div>
<div class="line number78 index77 alt1">
78</div>
<div class="line number79 index78 alt2">
79</div>
<div class="line number80 index79 alt1">
80</div>
<div class="line number81 index80 alt2">
81</div>
<div class="line number82 index81 alt1">
82</div>
<div class="line number83 index82 alt2">
83</div>
<div class="line number84 index83 alt1">
84</div>
<div class="line number85 index84 alt2">
85</div>
<div class="line number86 index85 alt1">
86</div>
<div class="line number87 index86 alt2">
87</div>
<div class="line number88 index87 alt1">
88</div>
<div class="line number89 index88 alt2">
89</div>
<div class="line number90 index89 alt1">
90</div>
<div class="line number91 index90 alt2">
91</div>
<div class="line number92 index91 alt1">
92</div>
<div class="line number93 index92 alt2">
93</div>
<div class="line number94 index93 alt1">
94</div>
<div class="line number95 index94 alt2">
95</div>
<div class="line number96 index95 alt1">
96</div>
<div class="line number97 index96 alt2">
97</div>
<div class="line number98 index97 alt1">
98</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="cpp comments">//lib_test.cc</code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp preprocessor">#include <iostream></code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp preprocessor">#include <stack></code>
</div>
<div class="line number4 index3 alt1">
<code class="cpp preprocessor">#include"stdlib.h"</code>
</div>
<div class="line number5 index4 alt2">
<code class="cpp preprocessor">#include <time.h></code>
</div>
<div class="line number6 index5 alt1">
<code class="cpp preprocessor">#include "lib_test.h"</code>
</div>
<div class="line number7 index6 alt2">
<code class="cpp keyword bold">using</code> <code class="cpp keyword bold">namespace</code> <code class="cpp plain">std;</code>
</div>
<div class="line number8 index7 alt1">
<code class="cpp keyword bold">template</code><code class="cpp plain"><</code><code class="cpp keyword bold">class</code> <code class="cpp plain">t></code>
</div>
<div class="line number9 index8 alt2">
<code class="cpp keyword bold">void</code> <code class="cpp plain">sort<t>::exchange(t a[], </code><code class="cpp color1 bold">int</code> <code class="cpp plain">i, </code><code class="cpp color1 bold">int</code> <code class="cpp plain">j)</code>
</div>
<div class="line number10 index9 alt1">
<code class="cpp plain">{</code>
</div>
<div class="line number11 index10 alt2">
<code class="cpp plain">t temp = a;</code>
</div>
<div class="line number12 index11 alt1">
<code class="cpp plain">a = a;</code>
</div>
<div class="line number13 index12 alt2">
<code class="cpp plain">a = temp;</code>
</div>
<div class="line number14 index13 alt1">
<code class="cpp keyword bold">return</code><code class="cpp plain">;</code>
</div>
<div class="line number15 index14 alt2">
<code class="cpp plain">}</code>
</div>
<div class="line number16 index15 alt1">
</div>
<div class="line number17 index16 alt2">
<code class="cpp keyword bold">template</code><code class="cpp plain"><</code><code class="cpp keyword bold">class</code> <code class="cpp plain">t></code>
</div>
<div class="line number18 index17 alt1">
<code class="cpp color1 bold">int</code> <code class="cpp plain">sort<t>::partition(t a[],</code><code class="cpp color1 bold">int</code> <code class="cpp plain">p,</code><code class="cpp color1 bold">int</code> <code class="cpp plain">r)</code>
</div>
<div class="line number19 index18 alt2">
<code class="cpp plain">{</code>
</div>
<div class="line number20 index19 alt1">
</div>
<div class="line number21 index20 alt2">
<code class="cpp color1 bold">int</code> <code class="cpp plain">i = p;</code>
</div>
<div class="line number22 index21 alt1">
<code class="cpp color1 bold">int</code> <code class="cpp plain">j = p-1;</code>
</div>
<div class="line number23 index22 alt2">
<code class="cpp plain">t ref = a;</code>
</div>
<div class="line number24 index23 alt1">
<code class="cpp color1 bold">int</code> <code class="cpp plain">refid = p;</code>
</div>
<div class="line number25 index24 alt2">
<code class="cpp functions bold">srand</code><code class="cpp plain">((unsigned)</code><code class="cpp functions bold">time</code><code class="cpp plain">(null));</code>
</div>
<div class="line number26 index25 alt1">
<code class="cpp plain">refid = (</code><code class="cpp functions bold">rand</code><code class="cpp plain">() % (r-p+1))+ p;</code>
</div>
<div class="line number27 index26 alt2">
<code class="cpp comments">//cout<<refid<<endl;</code>
</div>
<div class="line number28 index27 alt1">
<code class="cpp plain">ref = a;</code>
</div>
<div class="line number29 index28 alt2">
<code class="cpp keyword bold">for</code><code class="cpp plain">(; i<=r; i++)</code>
</div>
<div class="line number30 index29 alt1">
<code class="cpp plain">{</code>
</div>
<div class="line number31 index30 alt2">
<code class="cpp keyword bold">if</code><code class="cpp plain">(a < ref)</code>
</div>
<div class="line number32 index31 alt1">
<code class="cpp plain">{</code>
</div>
<div class="line number33 index32 alt2">
<code class="cpp plain">j++;</code>
</div>
<div class="line number34 index33 alt1">
<code class="cpp plain">exchange(a, i, j);</code>
</div>
<div class="line number35 index34 alt2">
<code class="cpp keyword bold">if</code><code class="cpp plain">(j == refid)</code>
</div>
<div class="line number36 index35 alt1">
<code class="cpp plain">{</code>
</div>
<div class="line number37 index36 alt2">
<code class="cpp plain">refid = i;</code>
</div>
<div class="line number38 index37 alt1">
<code class="cpp plain">}</code>
</div>
<div class="line number39 index38 alt2">
<code class="cpp plain">}</code>
</div>
<div class="line number40 index39 alt1">
</div>
<div class="line number41 index40 alt2">
<code class="cpp plain">}</code>
</div>
<div class="line number42 index41 alt1">
<code class="cpp plain">exchange(a, j+1, refid);</code>
</div>
<div class="line number43 index42 alt2">
</div>
<div class="line number44 index43 alt1">
<code class="cpp keyword bold">return</code> <code class="cpp plain">j+1;</code>
</div>
<div class="line number45 index44 alt2">
<code class="cpp plain">}</code>
</div>
<div class="line number46 index45 alt1">
</div>
<div class="line number47 index46 alt2">
<code class="cpp keyword bold">template</code><code class="cpp plain"><</code><code class="cpp keyword bold">class</code> <code class="cpp plain">t></code>
</div>
<div class="line number48 index47 alt1">
<code class="cpp keyword bold">void</code> <code class="cpp plain">sort<t>::myqsort(t a[],</code><code class="cpp color1 bold">int</code> <code class="cpp plain">p,</code><code class="cpp color1 bold">int</code> <code class="cpp plain">r)</code>
</div>
<div class="line number49 index48 alt2">
<code class="cpp plain">{</code>
</div>
<div class="line number50 index49 alt1">
<code class="cpp color1 bold">int</code> <code class="cpp plain">q = 0;</code>
</div>
<div class="line number51 index50 alt2">
<code class="cpp keyword bold">if</code><code class="cpp plain">(p<r)</code>
</div>
<div class="line number52 index51 alt1">
<code class="cpp plain">{</code>
</div>
<div class="line number53 index52 alt2">
<code class="cpp plain">q = partition(a, p, r);</code>
</div>
<div class="line number54 index53 alt1">
<code class="cpp plain">myqsort(a, p, q-1);</code>
</div>
<div class="line number55 index54 alt2">
<code class="cpp plain">myqsort(a, p+1, r);</code>
</div>
<div class="line number56 index55 alt1">
<code class="cpp plain">}</code>
</div>
<div class="line number57 index56 alt2">
</div>
<div class="line number58 index57 alt1">
<code class="cpp keyword bold">return</code><code class="cpp plain">;</code>
</div>
<div class="line number59 index58 alt2">
</div>
<div class="line number60 index59 alt1">
<code class="cpp plain">}</code>
</div>
<div class="line number61 index60 alt2">
</div>
<div class="line number62 index61 alt1">
<code class="cpp keyword bold">template</code><code class="cpp plain"><</code><code class="cpp keyword bold">class</code> <code class="cpp plain">t></code>
</div>
<div class="line number63 index62 alt2">
<code class="cpp keyword bold">void</code> <code class="cpp plain">sort<t>::myqsortnorecur(t a[], </code><code class="cpp color1 bold">int</code> <code class="cpp plain">p, </code><code class="cpp color1 bold">int</code> <code class="cpp plain">r)</code>
</div>
<div class="line number64 index63 alt1">
<code class="cpp plain">{</code>
</div>
<div class="line number65 index64 alt2">
<code class="cpp color1 bold">int</code> <code class="cpp plain">start = p;</code>
</div>
<div class="line number66 index65 alt1">
<code class="cpp color1 bold">int</code> <code class="cpp plain">end = r;</code>
</div>
<div class="line number67 index66 alt2">
<code class="cpp color1 bold">int</code> <code class="cpp plain">mid = 0;</code>
</div>
<div class="line number68 index67 alt1">
<code class="cpp plain">std::stack<</code><code class="cpp color1 bold">int</code><code class="cpp plain">> sortstk;</code>
</div>
<div class="line number69 index68 alt2">
</div>
<div class="line number70 index69 alt1">
<code class="cpp plain">sortstk.push(p);</code>
</div>
<div class="line number71 index70 alt2">
<code class="cpp plain">sortstk.push(r);</code>
</div>
<div class="line number72 index71 alt1">
</div>
<div class="line number73 index72 alt2">
<code class="cpp keyword bold">while</code><code class="cpp plain">(!sortstk.empty())</code>
</div>
<div class="line number74 index73 alt1">
<code class="cpp plain">{</code>
</div>
<div class="line number75 index74 alt2">
<code class="cpp plain">end = sortstk.top();</code>
</div>
<div class="line number76 index75 alt1">
<code class="cpp plain">sortstk.pop();</code>
</div>
<div class="line number77 index76 alt2">
<code class="cpp plain">start = sortstk.top();</code>
</div>
<div class="line number78 index77 alt1">
<code class="cpp plain">sortstk.pop();</code>
</div>
<div class="line number79 index78 alt2">
<code class="cpp keyword bold">if</code><code class="cpp plain">(start < end)</code>
</div>
<div class="line number80 index79 alt1">
<code class="cpp plain">{</code>
</div>
<div class="line number81 index80 alt2">
<code class="cpp plain">mid = partition(a, start, end);</code>
</div>
<div class="line number82 index81 alt1">
<code class="cpp plain">sortstk.push(start);</code>
</div>
<div class="line number83 index82 alt2">
<code class="cpp plain">sortstk.push(mid -1);</code>
</div>
<div class="line number84 index83 alt1">
<code class="cpp plain">sortstk.push(mid + 1);</code>
</div>
<div class="line number85 index84 alt2">
<code class="cpp plain">sortstk.push(end);</code>
</div>
<div class="line number86 index85 alt1">
<code class="cpp plain">}</code>
</div>
<div class="line number87 index86 alt2">
<code class="cpp plain">}</code>
</div>
<div class="line number88 index87 alt1">
</div>
<div class="line number89 index88 alt2">
<code class="cpp plain">}</code>
</div>
<div class="line number90 index89 alt1">
<code class="cpp keyword bold">namespace</code> <code class="cpp plain">quick_sort_instance</code>
</div>
<div class="line number91 index90 alt2">
<code class="cpp plain">{</code>
</div>
<div class="line number92 index91 alt1">
<code class="cpp keyword bold">void</code> <code class="cpp plain">template_instance()</code>
</div>
<div class="line number93 index92 alt2">
<code class="cpp plain">{</code>
</div>
<div class="line number94 index93 alt1">
<code class="cpp color1 bold">int</code> <code class="cpp plain">a[]={1,2};</code>
</div>
<div class="line number95 index94 alt2">
<code class="cpp plain">sort<</code><code class="cpp color1 bold">int</code><code class="cpp plain">>::myqsortnorecur(a, 0, 1);</code>
</div>
<div class="line number96 index95 alt1">
<code class="cpp plain">}</code>
</div>
<div class="line number97 index96 alt2">
</div>
<div class="line number98 index97 alt1">
<code class="cpp plain">}</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
好,重复上面的编译过程:</p>
<p>
<img title="Linux静态链接库与模板类的处理方式" alt="Linux静态链接库与模板类的处理方式" src="https://zhuji.jb51.net/uploads/img/202305/77dcc5a231c3f546ba52d50842614c2e.jpg"></p>
<p>
这些编译和执行过程就能正常进行了。</p>
<p>
</p>
<p>
但是这种所谓的“实例化”过程有一个明显的缺点,那就是,本身这个sort类是一个模板类,可以排序任意类型的数据,</p>
<p>
就本例子而言,只“实例化”了一种int类型的接口。因此当我想排序一个float类型的数组时,我就必须在.a文件里面再“实例化”一个float接口。</p>
<p>
显然,假如我想把该具有sort功能的类,抽象成一个独立的模块,但是我并不知道该.a的用户想排序的数据类型是什么,那么将必须穷举所有的数据类型</p>
<p>
这显然是不可能的。这一局限性不只时模板类,同样的,模板函数也是如此。</p>
<p>
结论:最好不要在静态链接库中使用模板,同样的,动态链接库也一样。</p>
<p>
想到这里,脑子里忽然蹦出来一个想法:c++的stl到底是动态链接韩式静态链接的呢?stl使用了大量的模板,按照这篇博客在讨论的内容,似乎是矛盾的。在网上找了半天</p>
<p>
参考知乎的大神们是怎么解释的吧:</p>
<p>
https://www.zhihu.com/question/46098144</p>
<p>
以上就是本文的全部心得和内容,如果大家还有所疑问和建议,可以在下面的留言区讨论。</p>
<p>
原文链接:https://www.cnblogs.com/real-madrid/p/7862087.html</p>
頁:
[1]