C++ gcc-定义模板时出现多个定义错误(vc+;+;很好)

C++ gcc-定义模板时出现多个定义错误(vc+;+;很好),c++,gcc,C++,Gcc,我使用的是EnumParser,因为它在VC++中编译得很好,但是使用gcc我有这样的错误: ./Terminator.o: In function `EnumParser<FieldType>::EnumParser()': Terminator.cpp:(.text+0x960): multiple definition of `EnumParser<FieldType>::EnumParser()' ./MicexGate.o:MicexGate.cpp:(.tex

我使用的是
EnumParser
,因为它在VC++中编译得很好,但是使用gcc我有这样的错误:

./Terminator.o: In function `EnumParser<FieldType>::EnumParser()':
Terminator.cpp:(.text+0x960): multiple definition of `EnumParser<FieldType>::EnumParser()'
./MicexGate.o:MicexGate.cpp:(.text+0xd0): first defined here
./Terminator.o: In function `EnumParser<FieldType>::EnumParser()':
Terminator.cpp:(.text+0x960): multiple definition of `EnumParser<FieldType>::EnumParser()'
./MicexGate.o:MicexGate.cpp:(.text+0xd0): first defined here
./Terminator.o: In function `EnumParser<FieldsetName>::EnumParser()':

如何解决我的问题?

模板需要在标题中,而不是在.cpp文件中。

我猜您还没有在标题中声明明确的专业化,包括在每个使用专业化的文件中:

template<> EnumParser<FieldType>::EnumParser();
模板EnumParser::EnumParser();
如果没有这个声明,编译器就不知道显式专门化存在,因此如果需要的话,它将从通用模板实例化隐式专门化。现在有两个定义,可能会导致链接错误


或者,与任何函数一样,您可以在标题中定义它,只要您声明它
inline
,以允许在多个翻译单元中进行定义。

虽然为true,但它不会解释OP询问的错误。这是一种明确的专业化,而不是模板定义。它服从于一个定义规则,就像一个正则函数一样;所以需要进入源文件,或者声明为
inline
。它最初在
.h
文件中,但我有相同的编译错误。我把它移到了.cpp,希望这能有所帮助,但它没有t@javapowered:如果它位于标题中,则需要
内联
。如果它在源文件中,那么它需要在头文件中声明。您是否声明了明确的专业化,并将该声明包含在使用它的每个文件中?如果编译器不知道,那么它将专门化通用模板,而不是使用您的专门化,从而产生多个定义。我尝试移动到.h文件并添加
inline
,但这没有帮助。我将尝试将显式声明添加到.h文件,并将实现添加到.cpp文件。我已尝试将.h文件中的定义与.cpp文件中的实现分离。由于某种原因,这在我的情况下不起作用。@javapowered:你的意思是你在
.h
文件(如我的回答)中尝试了一个声明,在
.cpp
文件(如你的问题)中尝试了定义(又称推进)?只要你在需要专业化的地方包括标题,这应该是可行的。如果没有,请告诉我们您尝试了什么(最好是作为一个最小但完整的测试用例)以及出现了什么错误。谢谢,我不知道第一次发生了什么,我已经尝试了好几次,转移到另一个.h文件,毕竟它是有效的。有时只要在
.h
中添加
内联
就足够了,再次感谢!
template<> EnumParser<FieldType>::EnumParser();