c – 显式模板实例化如何影响链接器可以找到的内容?
发布时间:2020-12-16 05:42:04 所属栏目:百科 来源:网络整理
导读:请看下面的代码,并清除我的疑惑. 由于ABC是一个模板,为什么当我们将ABC类成员函数的定义放在test.cpp中时,它不会显示错误? 如果我将test.cpp代码放在test.h和remve 2中,那么它工作正常.为什么? . // test.h template typename T class ABC { public: void
请看下面的代码,并清除我的疑惑.
>由于ABC是一个模板,为什么当我们将ABC类成员函数的定义放在test.cpp中时,它不会显示错误? . // 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.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 } 在这个例子中,主要的编译器看不到foo和bar定义,所以它不能实例化方法.编译器在处理main.cpp时会很乐意接受代码,因为你告诉它ABC是一个模板,并且它有这两个函数,并且会假定它们将被定义在一些其他的翻译单元中. 在包含test.cpp的翻译单元中,编译器看到两个方法定义,并且这两个实例化(方法/类)都可以被完全处理.如果只有方法实例化([1])存在,编译器将只生成该方法,并且将不定义条.所以任何代码,包括test.h,链接到编译的test.cpp并且只使用foo方法将编译和链接,但是由于它的使用不定义,bar的使用将无法链接. 显式地实例化类模板生成所有成员方法的符号,在这种情况下,包含test.h的任何翻译单元和编译的test.cpp对象文件的链接都将被编译和链接. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- c# – mock HttpContext.Current.Server.MapPath使用Moq?
- 正则表达式在组内获得匹配
- 为什么我不能在malloc()分配的变量上调用free()?
- c – 如何安装Modular Boost?
- ArgumentError:Error #2004:某个参数无效
- ruby – 使用Savon SOAP库“HTTPI尝试使用httpi适配器”错误
- React Native填坑之旅--HTTP请求篇
- Qt中提高sqlite的读写速度
- cocos2d-x 3.0rc开发指南:Windows下Android环境搭建
- c# – 使用TPL Dataflow,我可以取消所有帖子然后添加一个吗