Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用包含不同typedef枚举的派生类模板设置构造函数初始化列表?_C++_Templates_Inheritance - Fatal编程技术网

C++ 如何使用包含不同typedef枚举的派生类模板设置构造函数初始化列表?

C++ 如何使用包含不同typedef枚举的派生类模板设置构造函数初始化列表?,c++,templates,inheritance,C++,Templates,Inheritance,我有一个类模板片段 template <typename T> class Piece { public: Piece() : m_texture(TextureMap::TileTextureID::CITY1) // ERROR!!!! See question bellow { } //... private: Texture<T> m_texture; }; 最后,我有一个classTe

我有一个
类模板
片段

template <typename T>
class Piece
{
public:
    Piece()
    : m_texture(TextureMap::TileTextureID::CITY1) // ERROR!!!! See question bellow
    {
    }

    //...
private:
    Texture<T>              m_texture;
};
最后,我有一个class
TextureMap

class TextureMap
{
public:
    TextureMap();
    ~TextureMap();

    typedef enum
    {
        CITY1,
        CITY2,
    } TileTextureID;

    typedef enum
    {
        RED,
        BLUE
    } MeepleTextureID;

};
问题:

error C2664: 'Texture<T>::Texture(T)' : cannot convert parameter 1 from 'TextureMap::TileTextureID' to 'TextureMap::MeepleTextureID'
如您所见,我需要在
工件
构造函数的初始化列表中初始化
m_纹理
。。。 我想这样初始化它:

  • 如果
    片段
    被实例化为
    片段
    ,那么我希望构造函数初始化列表为:

    m_纹理(TextureMap::TiletTextureId::CITY1)

  • 但是如果
    片段
    被实例化为
    片段
    ,我希望:

    m_纹理(TextureMap::MeepleTextureID::红色)

如何在类模板中执行此操作?

错误:

error C2664: 'Texture<T>::Texture(T)' : cannot convert parameter 1 from 'TextureMap::TileTextureID' to 'TextureMap::MeepleTextureID'
错误C2664:'Texture::Texture(T)':无法将参数1从'TextureMap::TiletTextureId'转换为'TextureMap::MeepleTextureID'

您可以使用模板专门化

首先,让基函数保持未定义状态。您可以选择使用默认代码来定义它

template <typename T>
class Piece
{
public:
    Piece();
};
现在构造函数很简单:

template <typename T>
class Piece
{
public:
    Piece()
        :m_texture(default_texture_value((T*)NULL)
    {
    }
};
模板
班级作品
{
公众:
件()
:m_纹理(默认_纹理_值((T*)NULL)
{
}
};
您还可以将这两种想法混合到有时称为特征类型的方法中。这可能会对您的场景造成过度伤害,但如果每个枚举都有许多相关的不同功能,则可能会很有用:

template<typename T> struct texture_traits {};

template<> struct texture_traits<TileTextureID>
{
    static TileTextureID default_texture_value()
    { return TileTextureID::CITY1; }
};

template <typename T>
class Piece
{
public:
    Piece()
      :m_texture(texture_traits<T>::default_texture_value())
    {}
};
模板结构纹理特征{};
模板结构纹理特征
{
静态平铺纹理默认纹理值()
{return TileTextureID::CITY1;}
};
模板
班级作品
{
公众:
件()
:m_纹理(纹理特征::默认纹理值())
{}
};
或者为了更大的灵活性:

template <typename T, typename TT = texture_traits<T> >
class Piece
{
public:
    Piece()
      :m_texture(TT::default_texture_value())
    {}
};
模板
班级作品
{
公众:
件()
:m_纹理(TT::默认_纹理_值())
{}
};
template<typename T> struct texture_traits {};

template<> struct texture_traits<TileTextureID>
{
    static TileTextureID default_texture_value()
    { return TileTextureID::CITY1; }
};

template <typename T>
class Piece
{
public:
    Piece()
      :m_texture(texture_traits<T>::default_texture_value())
    {}
};
template <typename T, typename TT = texture_traits<T> >
class Piece
{
public:
    Piece()
      :m_texture(TT::default_texture_value())
    {}
};