Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++模板和包含保护 对于C++,我比较新,所以我的问题可能有一个简单的答案;然而,我无法找出为什么我的代码在我认为应该的时候不起作用。示例代码如下所示_C++_Templates_Include Guards - Fatal编程技术网

C++模板和包含保护 对于C++,我比较新,所以我的问题可能有一个简单的答案;然而,我无法找出为什么我的代码在我认为应该的时候不起作用。示例代码如下所示

C++模板和包含保护 对于C++,我比较新,所以我的问题可能有一个简单的答案;然而,我无法找出为什么我的代码在我认为应该的时候不起作用。示例代码如下所示,c++,templates,include-guards,C++,Templates,Include Guards,我一直在网上阅读有关如何在包含模板时避免错误的信息。其中之一就是我在这里试图实现的:在a.h中包含a.cpp。但是,我所看到的示例仍然使用a.cpp中包含a.h,如示例代码所示。但是,我得到的函数模板已经定义错误。我发现使用ifdefa并注释掉A.cpp中的include A.h将帮助我摆脱这个重新定义的错误。但我想知道发生了什么。a.h中的include guard不应该处理重新定义吗?简短回答:如果实现与声明不在同一个标头中,那么当编译器尝试实例化模板时,将无法访问它。这不是将模板实现与模板

我一直在网上阅读有关如何在包含模板时避免错误的信息。其中之一就是我在这里试图实现的:在a.h中包含a.cpp。但是,我所看到的示例仍然使用a.cpp中包含a.h,如示例代码所示。但是,我得到的函数模板已经定义错误。我发现使用ifdefa并注释掉A.cpp中的include A.h将帮助我摆脱这个重新定义的错误。但我想知道发生了什么。a.h中的include guard不应该处理重新定义吗?

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

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

只需将所有模板内容放在头文件中,然后忘记它。一般来说,包含.cpp文件会带来麻烦。你应该自己编译每个.cpp文件来构建你的程序,一次也只能编译一次。@NeilKirk说了什么,还有。就像大家说的,你应该重新安排东西。然而,这仍然无法回答这个问题:为什么要重新定义?我猜您正在尝试编译a.cpp,而不仅仅是driver.cpp。如果您试图编译a.cpp,它将包含a.h,其中包含a::a的a.cpp第一个定义,然后a::a将在包含a.h后再次定义。注释掉的“ifdef a”将删除第一个定义。@ChrisA。我看不出我的代码与您在链接中提供的第一个解决方案有什么本质区别。我注意到的区别是include-guard、tpp而不是cpp,以及cpp文件中缺少的include.h。我尝试根据上面提到的最后一个差异进行更改,但我遇到了更多错误,我认为这是由于实现文件不知道声明。至于排除include-guard,我将得到循环依赖。你能更具体一点说我做错了什么吗?
//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;
}