c – 显式模板实例化如何影响链接器可以找到的内容?

c – 显式模板实例化如何影响链接器可以找到的内容?,第1张

概述请看下面的代码,并清除我的疑惑. >由于ABC是一个模板,为什么当我们将ABC类成员函数的定义放在test.cpp中时,它不会显示错误? >如果我将test.cpp代码放在test.h和remve 2中,那么它工作正常.为什么? . // test.h template <typename T> class ABC { public: void foo( T& ); void 请看下面的代码,并清除我的疑惑.

>由于ABC是一个模板,为什么当我们将ABC类成员函数的定义放在test.cpp中时,它不会显示错误?
>如果我将test.cpp代码放在test.h和remve 2中,那么它工作正常.为什么?

.

// test.h template <typename T> class ABC { public:    voID foo( T& );    voID bar( T& ); }; // test.cpp template <typename T> voID ABC<T>::foo( T& ) {} // deFinition template <typename T> voID ABC<T>::bar( T& ) {} // deFinition template voID ABC<char>::foo( char & );  // 1 template class ABC<char>;                // 2 // main.cpp #include "test.h" int main() {    ABC<char> a;    a.foo();     // valID with 1 or 2    a.bar();     // link error if only 1,valID with 2 }
解决方法 在这两种情况下,您正在做一个明确的实例化.在第二种情况下,只有ABC< char> :: foo正在被实例化,而在第一种情况下,ABC< char> :: bar也被实例化.

一个不同的类似例子可以澄清其含义:

// test.htemplate <typename T>class ABC {public:   voID foo( T& );   voID bar( T& );};// test.cpptemplate <typename T>voID ABC<T>::foo( T& ) {} // deFinitiontemplate <typename T>voID ABC<T>::bar( T& ) {} // deFinitiontemplate voID ABC<char>::foo( char & );  // 1template class ABC<char>;                // 2// main.cpp#include "test.h"int main() {   ABC<char> a;   a.foo();     // valID with 1 or 2   a.bar();     // link error if only 1,valID with 2}

在这个例子中,主要的编译器看不到foo和bar定义,所以它不能实例化方法.编译器在处理main.cpp时会很乐意接受代码,因为你告诉它ABC是一个模板,并且它有这两个函数,并且会假定它们将被定义在一些其他的翻译单元中.

在包含test.cpp的翻译单元中,编译器看到两个方法定义,并且这两个实例化(方法/类)都可以被完全处理.如果只有方法实例化([1])存在,编译器将只生成该方法,并且将不定义条.所以任何代码,包括test.h,链接到编译的test.cpp并且只使用foo方法将编译和链接,但是由于它的使用不定义,bar的使用将无法链接.

显式地实例化类模板生成所有成员方法的符号,在这种情况下,包含test.h的任何翻译单元和编译的test.cpp对象文件的链接都将被编译和链接.

总结

以上是内存溢出为你收集整理的c – 显式模板实例化如何影响链接器可以找到的内容?全部内容,希望文章能够帮你解决c – 显式模板实例化如何影响链接器可以找到的内容?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1249300.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存