typedef模板类实例

时间:2015-09-11 22:09:34

标签: c++ templates enums

我是那个班级层次结构:

  • enum class;
  • 基类(构造函数获取枚举类对象);
  • 从base派生的模板类(构造函数获取枚举类对象)

我会为模板类的每个实例定义一个typedef。 模板类的每个实例都将枚举类的元素作为参数。 这是代码:

#include <iostream>
using namespace std;
enum class instrument_name { none = 0, piano, guitar, trumpet, saxophone} ;
class instrument_base
{
public:
instrument_base(instrument_name name): _name(name)
{
cout << "I'm base class" << endl;
}
virtual ~instrument_base(){}
// other functions

private:
instrument_name _name;
};

template<class T>
class instrument : public instrument_base
{
public:
instrument(instrument_name name):instrument_base(name)
{
cout << "I'm template class" << endl;
}
};

typedef instrument<instrument_name::piano> Piano;    // error
typedef instrument<instrument_name::guitar> Guitar;    // error
typedef instrument<instrument_name::trumpet> Trumpet;    // error
typedef instrument<instrument_name::saxophone> Saxophone;    // error

int main()
{
cout << "Hello Instruments!" << endl;

Piano p;
Guitar g;
Trumpet tr;
Saxophone s;

return 0;
}

我试图在Windows上使用Code :: Blocks(13.12)编译此示例 我得到了那些错误: - 错误:在模板参数列表中参数1的类型/值不匹配 &#39;模板类工具&#39; | - 错误:期待一种类型,得到钢琴&#39; |

任何暗示都是如此。

2 个答案:

答案 0 :(得分:3)

instrument_name::piano不是一种类型。因此,你不能使用:

typedef instrument<instrument_name::piano> Piano;

您可以使用:

// Use a non-type template parameter.
template <instrument_name i_name>
class instrument : public instrument_base
{
   public:
      instrument():instrument_base(i_name)
   {
      cout << "I'm template class" << endl;
   }
};

typedef instrument<instrument_name::piano> Piano;
Piano p;

答案 1 :(得分:2)

模板需要一个类型,而不是一个值。您的错误消息很好地解释了这一点,您只需仔细阅读即可。

您可以在模板中使用instrument_name代替class来解决此问题。

template<instrument_name T>
class instrument : public instrument_base
{
public:
   instrument() :instrument_base(T)
   {
      cout << "I'm template class" << endl;
   }
};