gcc - 定义模板时的多重定义错误(vc ++ fine)

时间:2014-09-22 12:10:58

标签: c++ gcc

我在here使用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()':

EnumParser<FieldType>::EnumParser()MicexGate.o似乎Terminator.o出现,这就是问题所在。但我不知道为什么这是一个错误,以及如何解决它。

在我的程序中,我只在.cpp静态lib项目的MicexGate文件中定义了这个EnumParser。 Terminator取决于MicexGate,这可能就是为什么最终EnumParser定义了两次。这就是我定义EnumParser<FieldType>

的方式
#include "FieldsConverter.h"
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <iostream>
#include "ByteArrayReader.h"
#include "Utils.h"
#include "CommonsMicexBridge.h"
#include "InstrumentsStorage.h"
#include <boost/algorithm/string.hpp>

template<> EnumParser<FieldType>::EnumParser()
{
    enumMap["Char"] = Char;
    enumMap["Integer"] = Integer;
    enumMap["Long"] = Long;
    enumMap["Fixed"] = Fixed;
    enumMap["Price"] = Price;
    enumMap["Date"] = Date;
    enumMap["Time"] = Time;
}

如何解决问题?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我的猜测是你没有在标题中声明显式特化,包含在每个使用特化的文件中:

template<> EnumParser<FieldType>::EnumParser();

如果没有此声明,编译器不知道显式特化存在,因此如果需要,将从通用模板实例化隐式特化。您现在有两个定义,导致(希望)链接错误。

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