包括模板功能

时间:2013-11-13 16:28:23

标签: c++ templates compilation linker header-files

我已经读过模板函数的主体必须包含在实际使用它的文件中(即,取消是不够的)。

假设我在头文件中定义了一个模板函数:

//someheader.h
#ifndef SOME_H
#define SOME_H
template<class T>
void MyTemplateFunc(T *In, ...)
{

//definitions here   

}
#endif

我实际上可以在两个不同的cpp文件中使用它:

//file1.cpp
#include "someheader.h"
void f1()
{
   //some code
   MyTemplateFunc<int>(Some_int_Pointer);//use template here

}

//file2.cpp
#include "someheader.h"
void f2()
{
   //some code
   MyTemplateFunc<float>(Some_float_Pointer);//use template here

}

现在,我没有抱怨(只是想了解)但是在这种情况下我怎么没有得到编译/链接错误?由于双包含保护将导致“someheader.h”仅包含在其中一个cpp文件中,这反过来将导致另一个cpp文件抱怨他无法“看到”模板定义。

我在这里缺少什么?

由于

2 个答案:

答案 0 :(得分:1)

  

“由于双包含保护将导致”someheader.h“仅包含在其中一个cpp文件中”

这是假的。该守卫避免了翻译单元中的多个声明。因此,您已将其包含在每个翻译单元中一次,一切正常。

此外,您应该在头文件中使用inline函数来遵守一个定义规则

答案 1 :(得分:1)

在我看来,你的file1.cpp和file2.cpp是两个不同的文件,彼此独立。

如果出现以下情况,您将收到错误消息,并且您的代码无法运行:

如果你没有使用ifndef并且你在file2.h中包含了file1.h,那么在file2.h中你已经声明了someheader.h“两次,因为它已经在file1.h中声明了,

//someheader.h

template<class T>
void MyTemplateFunc(T *In, ...)
{

  //definitions here   

}

file1头文件

//file1.h
#include "someheader.h"

void f1();

和file2头文件

//file2.h

#include "file1.h" //! note, it already has declared someheader.h
#include "someheader.h" //! you are declaring it again
void f2();

在这种情况下解决这样的问题,你应该包括ifndef或#pragma一次,这会导致当前的源文件只包含在一次编译中。