【问题标题】:Problem with Explicit Template Instantiation显式模板实例化问题
【发布时间】:2019-09-16 10:46:25
【问题描述】:

我无法通过显式模板实例化编译以下代码。

我在这一行得到一个错误:

std::map<uint8_t, std::string> DW_enumDescription::descMap = std::map<uint8_t, std::string>

用clang,错误是:

错误:“O::Data::DW_enumDescription”中没有名为“descMap”的成员

使用 G++ 是:

错误:ISO C++ 不允许将“O::Data::EnumDescription::descMap”定义为“O::Data::DW_enumDescription::descMap”[-fpermissive]

这里我一直使用相同的命名空间Data,即使在我的原始代码中我使用了两个单独的命名空间;但是,即使进行了这种简化,我也会遇到同样的错误。

#include <cstdint>
#include <map>
#include <string>

namespace O
{

    namespace Data
    {

        template<typename E             /* enum to describe */
                ,typename T = uint8_t   /* index type */
                >
        class EnumDescription
        {
        public:
            /// Static map to store the descriptions
            static std::map<T, std::string> descMap;
        };
    }
}

namespace O
{
    namespace Data
    {

        enum struct DW : uint8_t
        {
            DW_Unknown = 0,
            DW_TS_1    = 1,
            DW_TS_2    = 2,
            DW_DS_1    = 3,
            DW_Dev     = 4,
            enumSize   = 5
        };

        class DW_enumDescription : public Data::EnumDescription<DW, uint8_t> {};

    }
}


// ===================== Explicit Template Instantiation ======================
namespace O
{
    template class Data::EnumDescription<Data::DW, uint8_t>;
}
// ============================================================================

namespace O
{
    namespace Data
    {
        std::map<uint8_t, std::string> DW_enumDescription::descMap = std::map<uint8_t, std::string> // ERROR
        {
            { static_cast<uint8_t>(DW::DW_Unknown), "Unknown" },
            { static_cast<uint8_t>(DW::DW_TS_1),    "DW_TS_1" },
            { static_cast<uint8_t>(DW::DW_TS_2),    "DW_TS_2" },
            { static_cast<uint8_t>(DW::DW_DS_1),    "DW_DS_1" },
            { static_cast<uint8_t>(DW::DW_Dev),     "DW_Dev"  },
        };
    }
}

【问题讨论】:

    标签: c++ templates instantiation explicit-instantiation


    【解决方案1】:

    descMapEnumDescription&lt;DW, uint8_t&gt; 的成员,因此,修复:

    namespace O
    {
        namespace Data
        {
            template<> std::map<uint8_t, std::string> EnumDescription<DW, uint8_t>::descMap =
            {
                { static_cast<uint8_t>(DW::DW_Unknown), "Unknown" },
                { static_cast<uint8_t>(DW::DW_TS_1),    "DW_TS_1" },
                { static_cast<uint8_t>(DW::DW_TS_2),    "DW_TS_2" },
                { static_cast<uint8_t>(DW::DW_DS_1),    "DW_DS_1" },
                { static_cast<uint8_t>(DW::DW_Dev),     "DW_Dev"  },
            };
        }
    }
    

    【讨论】:

    • 是不是因为一个类的静态成员必须在自己的类中初始化(而不是它的派生类),而EnumDescription&lt;DW, uint8_t&gt;对应的是基类,而DW_enumDescription是派生类?
    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多