我已经读过模板函数的主体必须包含在实际使用它的文件中(即,取消是不够的)。
假设我在头文件中定义了一个模板函数:
//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文件抱怨他无法“看到”模板定义。
我在这里缺少什么?
由于
尼
答案 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一次,这会导致当前的源文件只包含在一次编译中。