Я использую EnumParser
из here Он отлично компилируется в VC++, но с использованием GCC у меня есть такая ошибка:НКУ - ошибка множественного определения при определении шаблона (VC++ отлично)
./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
, и это проблема. Но я не знаю, почему это ошибка и как ее исправить.
В моей программе я определяю этот EnumParser только один раз в файле .cpp
в файле MicexGate
static lib project. 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;
}
Как я могу исправить мою проблему?
Вы объявили явную специализацию и включили это объявление в каждый файл, который его использует? Если компилятор не знает об этом, он будет специализироваться на шаблоне общего назначения вместо использования вашей специализации, что приведет к нескольким определениям. –