【问题标题】:How to use using with CRTP?如何与 CRTP 一起使用?
【发布时间】:2013-01-14 13:40:08
【问题描述】:

在创建没有附加功能的类型时,我尝试使用using,而不是子类化或使用typedef

我有一个 CRTP 层次结构,我试图在树上传播具体类型。

GrandKid 似乎编译得很好。有没有办法让GrandKid_2 工作?

错误信息

junk.cpp:18:26: error: ‘GrandKid_2’ was not declared in this scope

代码

template<typename T>
struct Parent
{
};

template<typename T>
struct Child
    : public Parent<T>
{
};

struct GrandKid : 
    public Child<GrandKid>
{
};

// using GrandKid_2 = Child<GrandKid_2>;   // doesn't compile

int
main( int argv, char* argc[] )
{
    GrandKid gk;  // ok
}

【问题讨论】:

  • 错误信息是什么意思?
  • @svick 我用错误消息更新了 OP
  • using 创建别名,而不是新类型。因此,您不能使用GrandKid_2 来定义自己。
  • 概念上的问题是,您没有具体类型 GrandKid_2 可以传播到 Child。您只有Child&lt;...&gt; 的别名,但Child&lt;Child&lt;Child&lt;INFINITY&gt;&gt;&gt; 显然不起作用。还是您只是想为GrandKid 制作 typedef?在这种情况下,一个简单的typedef GrandKid GrandKid_2; 就可以了(但我想这不是你的目标)。
  • @kfmfe04 是的,typedef 也会创建别名。

标签: c++ templates c++11 typedef crtp


【解决方案1】:

usingtypedef 一样,创建一个别名,而不是一个新类型。因此,您不能使用 GrandKid_2 来定义自己。

你肯定需要创建一个新类型:

struct GrandKid_2 : Child<GrandKid_2> {};

顺便问一下,你真的想让GrandKid_2 成为它自己的孩子吗?也许你的意思是using GrandKid_2 = Child&lt;GrandKid&gt;

【讨论】:

  • 似乎是时候问一下 OP 将通过这个完成什么
  • @AndyT 别名更方便,因为我不需要重新定义构造函数来传播回树 - 这就是为什么我更喜欢 usingtypedef 当我可以使用它们时
  • 我很肯定GrandKid_2 真的应该是Child&lt;GrandKid_2&gt;。这就是 CRTP 通常的意义所在。
  • @Angew 你是对的 - 我需要使用结构形式并写出我的构造函数
猜你喜欢
  • 2017-04-16
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
相关资源
最近更新 更多