C++中,怎么将函数模板的声明和定义分开写?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中,怎么将函数模板的声明和定义分开写?相关的知识,希望对你有一定的参考价值。

C++中,能不能将函数模板的声明和定义分开写,比如将声明写在.h文件中,定义写在.cpp文件中。
如果能,具体应该怎样写,格式又是什么样的?
如果不能,为什么?
能把不能的原因说得再详细点吗?

不行。

目前c++还不支持模板定义与实现分开的写法,不过,这个功能已经在0x标准里出现了。
函数模板要被实例化后才能成为真正的函数,在使用函数模板的源文件中包含函数模板的头文件,如果该头文件中只有声明,没有定义,那编译器无法实例化该模板,最终导致链接错误。
参考技术A 据我所知,目前c++还不支持模板定义与实现分开的写法,不过,这个功能已经在0x标准里出现了。希望新的标准尽快推出。 参考技术B 现在主流的编译器还都没有实现将模板的定义和实现分开。 参考技术C 在vc++6下面试了一下,不行:
函数模板要被实例化后才能成为真正的函数,你在使用函数模板的源文件中包含函数模板的头文件,如果该头文件中只有声明,没有定义,那编译器无法实例化该模板,最终导致链接错误。本回答被提问者采纳

C++将模板的声明和定义放置在同一个头文件里

1. 一个类:
头文件用于保存类的声明;定义文件保存类的实现。
 
2. 分离编译模式:
允许在一个编译单元(.cpp文件)中定义函数、类型、类对象等,然后在另一个编译单元中引用它们。编译器处理完所有的编译单元后,链接器接下来会处理所有指向extern符号的引用(有时为缺省),从而生成单一可执行文件。
 
3. 模板类型:
模板类型不是一种实类型,它必须等到类型绑定后才能确定最终类型,所以在实例化一个模板时,必须要能够让编译器“看到”在哪里使用了模板,而且必须看到模板确切的定义,而不仅仅是它们的声明,否则不能顺利地产生编译代码。因此,标准会要求模板的实例化与定义体放到同一编译单元中。
// 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;
}

 

以上是关于C++中,怎么将函数模板的声明和定义分开写?的主要内容,如果未能解决你的问题,请参考以下文章

”更高级的宏“模板到底是怎么实例化的?

”更高级的宏“模板到底是怎么实例化的?

C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译?

植物大战 模板——C++

C++,2参数类模板的部分特化:无法将函数定义与现有声明匹配

精选C++类模板5分钟入门教程