Я использую C ++ 17 и пытаюсь сделать иерархию таких классов (упрощенной):
template<typename TChar>
class CLoggerTxtBase {
public:
using TString = std::basic_string<TChar>;
static TString _default_output_format;
};
using CLoggerTxt = CLoggerTxtBase<char>;
template<> std::basic_string<char> CLoggerTxt::_default_output_format{ "%F %T" };
using CLoggerWTxt = CLoggerTxtBase<wchar_t>;
template<> std::basic_string<wchar_t> CLoggerWTxt::_default_output_format{ L"%F %T" };
template<typename TChar> class CLoggerTxtFile {};
template<typename TChar> class CLoggerTxtCout {};
После этого у меня есть две функции, которые используют оба класса:
funct1(){
CLoggerTxtCout<wchar_t> log;
}
funct2() {
CLoggerTxtFile<wchar_t> log;
}
clang оповещает об ошибках компоновщика:
duplicate symbol 'Logger::CLoggerTxtBase<wchar_t>::_default_output_format' in:
CMakeFiles/test_logger.dir/src/logger_txt_file.cpp.o
CMakeFiles/test_logger.dir/src/logger_txt_cout.cpp.o
Я понятия не имею, как создать отдельный экземпляр _default_output_format для каждого экземпляра CLoggerTxtBase ... Из-за шаблона я не использую .CPP-файлы для иерархии классов. Похоже, что это должно быть как-то встроено ... Заранее спасибо!
UPD Мой коллега дал мне идею использовать статические функции, которые возвращают ссылку на строку. Это решение, но я все еще хотел бы знать, возможно ли использовать статические переменные таким образом.