【问题标题】:C++: Typedef of template classC++:模板类的Typedef
【发布时间】:2018-10-02 21:36:56
【问题描述】:

我正在尝试创建我拥有的矢量类的typedef。我在 SO 上发现了类似的问题,但它们侧重于接受不同类型数据的模板类,而我的类是基于整数的模板。

所以,我的类是这样定义的:

namespace sc_dt {
  template <int W> class sc_bv { ... }; //meaning systemc_bit_vector
}

我想使用 typedef,这样我就不必每次都输入sc_dt::。但是,通过使用这个:

typedef sc_dt::sc_bv<int> sc_vector;

我收到以下错误:

模板参数列表中参数 1 的类型/值不匹配

我该如何解决这个问题?

【问题讨论】:

  • 您的模板参数是一个int 值,而不是一个类。例如,您可以定义typedef sc_dt::sc_bv&lt;0&gt; sc_vector
  • 不要怀疑你的困境的诚意,但与sc_vector 相比,输入sc_dt::sc_bv 真的有多少麻烦?仅多出 3 个字符。
  • @StoryTeller 好点。最后我可能会把它命名为sc_v,但即使这样也不会让它变得更短。原因1是,当我遇到问题不知道如何解决时,它开始困扰我,所以我想知道如何去做。 ...如果只是为了简洁,我可以使用using sc_dt::sc_bv
  • @Rorschach 如果我是你,我可能会避免在sc_core 命名空间中重命名为已模板化的类sc_vector,参考可用here

标签: c++ class systemc


【解决方案1】:
namespace sc_dt {
  template <int W> class sc_bv { ... } //meaning systemc_bit_vector
}

具有非类型模板参数。当您实例化 sc_bv 的对象时,您需要给它一个 int 常量,例如

sc_dt::sc_bv<2> foo;

如你所见,它不同于

typedef sc_dt::sc_bv<int> sc_vector;

你给它一个类型,而不是一个值。

如果您知道要为 sc_vector 使用什么值,那么您可以使用

typedef sc_dt::sc_bv<the_value_that_you_want_to_use> sc_vector;

或者如果您只是希望 sc_vector 成为类模板的新名称,那么您可以使用别名模板,例如

template<int value>
using sc_vector = sc_dt::sc_bv<value>;

然后让你使用sc_vector like

sc_vector<some_value> foo;

【讨论】:

  • 在我的理解中,typedef 的目的只是为了节省打字工作,而不是引用特定的模板实例化。换句话说,别名应该仍然是一个模板。
  • @MaxLanghof 是的。刚刚添加了。
  • 很好的解释!
【解决方案2】:

typedefs 不能被模板化。不过usings可以(这样就达到了预期的效果):

template<int W>
using sc_vector = sc_dt::sc_bv<W>;

【讨论】:

    【解决方案3】:

    如果你不想每次都输入命名空间sc_dt::using命名空间或

    using sc_dt::sc_bv;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多