C++ 如何修复已定义的类模板?

C++ 如何修复已定义的类模板?,c++,class,templates,defined,C++,Class,Templates,Defined,我正在我的项目中实现ZipArchive库,我花了一个多小时的时间努力使它设置正确,以阻止所有链接器错误。但现在我仍然有这个问题,我不确定最好的方法来解决它,可能需要一些帮助 C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\afxtls_.h(199) : error C2953: 'CThreadLocal' : class template has already been defined c:\dev-mms\h

我正在我的项目中实现ZipArchive库,我花了一个多小时的时间努力使它设置正确,以阻止所有链接器错误。但现在我仍然有这个问题,我不确定最好的方法来解决它,可能需要一些帮助

C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\afxtls_.h(199) : error C2953: 'CThreadLocal' : class template has already been defined
c:\dev-mms\hl2sdk-ob-valve\public\tier0/threadtools.h(283) : see declaration of 'CThreadLocal'
C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\afxtls_.h(202) : warning C4005: 'THREAD_LOCAL' : macro redefinition
c:\dev-mms\hl2sdk-ob-valve\public\tier0/threadtools.h(71) : see previous definition of 'THREAD_LOCAL'

MS的ATL/MFC头和HL2 SDK都包含一个类模板
CThreadLocal


如果您要按照正确的顺序包括那些,即首先包括ATL/MFC头(或包括它们的头),然后是HL2 SDK头,那么HL2 SDK应该通过
#ifndef uuAFxtls\u H_uu
处理该问题,MS的ATL/MFC头和HL2 SDK都包含一个类模板
CThreadLocal

如果您想按正确的顺序包括这些标题,即首先是ATL/MFC标题(或包含它们的标题),然后是HL2 SDK标题,那么HL2 SDK应该通过
\ifndef\uu AFXTLS\u H_uu
C++模板提示来处理该问题:

  • 所有内容都必须在头文件(.h)中
  • 要解决重新定义问题,只需将代码放入:
#如果没有我的代码,例如 #定义我的代码 //你的代码 //在这里。 #恩迪夫 C++模板提示:

  • 所有内容都必须在头文件(.h)中
  • 要解决重新定义问题,只需将代码放入:
#如果没有我的代码,例如 #定义我的代码 //你的代码 //在这里。 #恩迪夫
您可以发布导致问题的代码部分吗?请注意,当您交叉发布到多个方面()时,明确提及它是一种很好的方式。您可以发布导致问题的代码部分吗?请注意,当您交叉发布到多个方面()时,明确提及它是一种很好的方式。这就是我的include看起来的样子,如果我将#include移到其他头的上方,我会得到#error:(“必须在tchar.h之前包含tier0类型的头”)我尝试了各种组合来重新组织标题,我要么得到其中一个,要么得到另一个。如果不进行测试,我就说不出您的案例需要哪种确切的顺序,而且我既没有安装HL2SDK,也没有安装zip存档。您可以尝试的一种黑客解决方法是用
\define\uuafxtls\uh\uuu
\undef\uuafxtls\uh\uu
包围HL2 include。另一种方法是不混合这些头文件,即在不同的源文件中实现zip文件包装器。这就是我的include看起来的样子,如果我将#include移到其他头的上方,我会得到#error:(“必须在tchar.h之前包含tier0类型的头”)我尝试了各种组合来重新组织标题,我要么得到其中一个,要么得到另一个。如果不进行测试,我就说不出您的案例需要哪种确切的顺序,而且我既没有安装HL2SDK,也没有安装zip存档。您可以尝试的一种黑客解决方法是用
\define\uuafxtls\uh\uuu
\undef\uuafxtls\uh\uu
包围HL2 include。另一种方法是简单地不混合这些头文件,即在不同的源文件中实现zip文件包装,或者使用“#pragma once”而不是“#ifndef”来避免重新定义。由于不必在#ifndef中选择唯一的名称,或者使用“#pragma once”而不是“#ifndef”来避免重新定义,因此它的键入更少,更可靠。由于不必在#ifndef中选择唯一的名称,因此它的输入更少,更可靠。 #ifndef __MY_CODE_eg #define __MY_CODE_eg // your code // here. #endif