c ++模板并包含警卫

时间:2014-10-01 01:12:55

标签: c++ templates include-guards

我对C ++比较陌生,所以我的问题可能很简单;但是,我不知道为什么我的代码在我认为应该的时候不起作用。示例代码如下。


//a.h
#ifndef A
#define A

template<class T>
class a{
public:
    a();
private:
    T str;
};

#include "a.cpp"
#endif

//a.cpp

//#ifdef A
#include "a.h"
using namespace std;

template<class T>
a<T>::a(){
    str = 'a';
}

//#endif

//driver.cpp
#include"a.h"
#include <string>
using namespace std;

void main(){
    a<string> object;
}

我一直在网上阅读有关如何在包含模板时摆脱错误的信息。其中一个就是我想在这里实现的目标:在#include "a.cpp"中拥有a.h。但是,我查看的示例仍使用#include "a.h"中的a.cpp,如示例代码所示。但是,我收到function template has already been defined错误。我发现使用#ifdef A并在a.cpp中注释#include "a.h"将帮助我摆脱这个重新定义的错误。但我想了解发生了什么。重新定义是否应该由a.h中的包含警卫处理?

2 个答案:

答案 0 :(得分:0)

简短回答:如果实现与声明不在同一个标​​题中,那么当编译器尝试实例化模板时,它将无法访问。

答案 1 :(得分:0)

这不是将模板实现与模板声明分开的方法。您不在.h文件中包含.cpp文件。相反,您只需将.cpp文件添加到项目文件或make文件中,以便像其他文件一样编译它。然后使用Explicit Template Instantiation来避免链接错误。