在创建 class 定义时使用 class 类型作为模板参数类型

Using class type as template argument type when create class definition

我有一个基础 class BaseCmd,例如:

template<typename T>    
class BaseCmd {
public:
private:
  T m;
};

然后导出classcmd1:

class Cmd1 : public BaseCmd<Cmd1::A> {
public:
  struct A {
    int c, d;
  };
};

但出现错误:

error: incomplete type ‘Cmd1‘ used in nested name specifier

甚至可以这样定义吗?谢谢。

Cmd1 完成之前,您不能拥有 Cmd1::A 类型的成员。简单的解决方法是在 Cmd1 之外定义 A。但是,如果出于某种原因你想在 Cmd1 中定义 A,你可以像这样添加一个中间层:

template<typename T>    
class BaseCmd {
public:
private:
  T m;
};


class Cmd1 {
public:
  struct A {
    int c, d;
  };
  struct impl : public BaseCmd<A> {};
};

Cmd1::impl 可以从 A 继承,因为 A 的定义在 BaseCmd<A> 用作基数 class 时已经完成。