【问题标题】:Statiс variable in base templated class, C++17 usage基础模板类中的统计变量,C++17 用法
【发布时间】: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


【解决方案1】:

感谢 VTT。我尝试了以下代码:

using CLoggerTxt = CLoggerTxtBase<char>;
template<> inline std::basic_string<char> CLoggerTxt::_default_output_format{ "%F %T" };

using CLoggerWTxt = CLoggerTxtBase<wchar_t>;
template<> inline std::basic_string<wchar_t> CLoggerWTxt::_default_output_format{ L"%F %T" };

这是正确的 C++17 解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 2014-03-13
    • 2017-06-09
    • 1970-01-01
    • 2014-06-22
    • 2023-02-07
    相关资源
    最近更新 更多