【发布时间】:2019-10-04 07:40:34
【问题描述】:
我使用 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
我不知道如何为每个 CLoggerTxtBase 实例制作单个 _default_output_format 实例...由于模板,我不使用 .CPP 文件作为类层次结构。 看起来它必须以某种方式内联...... 提前致谢!
UPD 我的同事给了我一个想法,即使用返回对字符串的引用的静态函数。这是一个解决方案,但我仍然想知道是否可以通过这种方式使用静态变量。
【问题讨论】:
-
你为什么不
inline他们?在 C++17 中,它比以前简单得多。
标签: c++ c++17 static-linking template-specialization