0

我对 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"in a.h. 但是,我查看的示例仍然使用#include "a.h"in a.cpp,如示例代码中所示。但是,我得到了function template has already been defined错误。我发现在 a.cpp 中使用#ifdef A并注释掉#include "a.h"将帮助我摆脱这个重新定义的错误。但我想了解发生了什么。重新定义不应该已经由 include 守卫处理了a.h吗?

4

2 回答 2

0

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

于 2014-10-01T01:36:35.173 回答
0

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

于 2014-10-01T01:17:19.770 回答