我对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
中的包含警卫处理?
答案 0 :(得分:0)
简短回答:如果实现与声明不在同一个标题中,那么当编译器尝试实例化模板时,它将无法访问。
答案 1 :(得分:0)
这不是将模板实现与模板声明分开的方法。您不在.h文件中包含.cpp文件。相反,您只需将.cpp文件添加到项目文件或make文件中,以便像其他文件一样编译它。然后使用Explicit Template Instantiation来避免链接错误。