C++将模板的声明和定义放置在同一个头文件里
2016-11-29 09:53
176 查看
1. 一个类:
头文件用于保存类的声明;定义文件保存类的实现。
2. 分离编译模式:
允许在一个编译单元(.cpp文件)中定义函数、类型、类对象等,然后在另一个编译单元中引用它们。编译器处理完所有的编译单元后,链接器接下来会处理所有指向extern符号的引用(有时为缺省),从而生成单一可执行文件。
3. 模板类型:
模板类型不是一种实类型,它必须等到类型绑定后才能确定最终类型,所以在实例化一个模板时,必须要能够让编译器“看到”在哪里使用了模板,而且必须看到模板确切的定义,而不仅仅是它们的声明,都则不能顺利地产生编译代码。因此,标准会要求模板的实例化与定义体放到同一编译单元中。
4. 三种方法:
(1)模板的声明和定义都放置在同一个.h文件中(最好):
(2)声明和实现分离,包含.cpp文件:
注意:不是所有编译器都支持此做法。
(3)使用export使声明实现分离:
注意:并非所有编译器都支持export关键字,且性能太差。
5. export原理:
在编译过程中,编译器会像.NET和Java那样,为模板实体生成一个“中间伪代码(IPC)”,使其他编译单元在实例化时可以找到定义体;而在遇到实例化时,则根据指定的实参再将此IPC重新编译,从而达到分离编译的目的。
原文链接:http://blog.sina.com.cn/s/blog_76fbd24d0101ab44.html
头文件用于保存类的声明;定义文件保存类的实现。
2. 分离编译模式:
允许在一个编译单元(.cpp文件)中定义函数、类型、类对象等,然后在另一个编译单元中引用它们。编译器处理完所有的编译单元后,链接器接下来会处理所有指向extern符号的引用(有时为缺省),从而生成单一可执行文件。
3. 模板类型:
模板类型不是一种实类型,它必须等到类型绑定后才能确定最终类型,所以在实例化一个模板时,必须要能够让编译器“看到”在哪里使用了模板,而且必须看到模板确切的定义,而不仅仅是它们的声明,都则不能顺利地产生编译代码。因此,标准会要求模板的实例化与定义体放到同一编译单元中。
4. 三种方法:
(1)模板的声明和定义都放置在同一个.h文件中(最好):
// Temp.h template <class T> class Temp { public: void set_value(const T& rT); protected: private: T m_value; }; template <class T> void Temp<T>::set_value(const T& rT) { m_value = rT; }
(2)声明和实现分离,包含.cpp文件:
// Temp.h template <class T> class Temp { public: void set_value(const T& rT); protected: private: T m_value; };
// Temp.cpp #include "Temp.h" template <class T> void Temp<T>::set_value(const T& rT) { m_value = rT; }
// main.cpp #include "Temp.cpp" // 包含.cpp文件
注意:不是所有编译器都支持此做法。
(3)使用export使声明实现分离:
// Temp.h template <class T> class Temp { public: void set_value(const T& rT); protected: private: T m_value; };
// Temp.cpp #include "Temp.h" export template <class T> void Temp<T>::set_value(const T& rT) { m_value = rT; }
// main.cpp #include "Temp.h" // 包含.h文件
注意:并非所有编译器都支持export关键字,且性能太差。
5. export原理:
在编译过程中,编译器会像.NET和Java那样,为模板实体生成一个“中间伪代码(IPC)”,使其他编译单元在实例化时可以找到定义体;而在遇到实例化时,则根据指定的实参再将此IPC重新编译,从而达到分离编译的目的。
原文链接:http://blog.sina.com.cn/s/blog_76fbd24d0101ab44.html
相关文章推荐
- C++ - 将模板的声明和定义放置在同一个头文件里
- C++ - 将模板的声明和定义放置在同一个头文件里
- C++ - 将模板的声明和定义放置在同一个头文件里
- C++中模板定义与声明为什么放在同一个文件中
- 需要将声明和定义放在同一个头文件
- C++模板中声明和定义是否可以分开存放在.h和.cpp文件中
- c++模板类/模板函数的声明与定义应该放在头文件里
- 程序文件【C/C++】变量的定义与声明
- C++的模板的声明和定义
- 为什么不能分开模板的声明和定义,把定义放到.cpp文件中?
- C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
- c++高级---C++声明、定义、类的定义、头文件作用、头文件重复引用,不具名空间以及编译器编译链接过程
- C++模板声明定义分离编译错误详解
- C++ 模板放置在 .h 文件中的一个原因
- C++-模板的声明和实现为何要放在头文件中
- C++中模板不能把实现和声明放在两个不同的文件下
- c++模板类/模板函数的声明与定义应该放在头文件里,不要分开来写类中函数的声明与定义
- 模板定义与声明需要一起放在头文件中原因的理解
- c++模板类/模板函数的声明与定义应该放在头文件里
- c++模板类/模板函数的声明与定义应该放在头文件里