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;
};
最后,我有一个classTextureMap
:
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())
{}
};