调用基类构造函数而不命名其类

vla*_*sch 4 c++ c++11 c++14

class MyDerived: public Incredble<Difficult< And<Complicated, Long>>, And<Even, Longer>, BaseClass, Name>
{
public:
  MyDerived();
}


MyDerived::MyDerived
: ???(params)
{}
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有编写全名的情况下调用基础构造函数并且没有类型化它?

原因显然是避免代码重复并引入多个位置以在基类模板params中的细节发生变化时进行更改.

第2级:

template <uint32 C>
class MyDerived: public Incredble<Difficult< And<Complicated, Long>>, And<Even, Longer>, BaseClass, Name>
{
public:
  MyDerived();
}

template <uint32 C>
MyDerived::MyDerived<C> 
: ???(C)
{
}
Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 7

您可以使用inject-class-name.Incredible<...>::Incredible引用自身,并且因为MyDerived它不是类模板,所以非限定查找将查看其基类的范围:

MyDerived::MyDerived
: Incredble(params)
{}
Run Code Online (Sandbox Code Playgroud)

如果Incredible从属名称,那么您需要对其进行限定.实际上,您可以简单地使用派生类型名称来限定基类的inject -class-name(h/t Johannes Schaub-litb):

MyDerived::MyDerived
: MyDerived::Incredible(params)
{}
Run Code Online (Sandbox Code Playgroud)

这适用于所有情况.

  • 如果它是一个类模板,`:MyDerived :: Incredible(params){}`应该可以工作. (4认同)
  • @JohannesSchaub-litb **哇。** 这就是我一直缺少的技巧。这似乎优于这里的所有其他解决方案,值得自己回答。因此,当基类是模板时,使用派生类名称进行限定会使注入的基类类型可见。我想这是有道理的,因为我们必须使用 `this-&gt;` 来获取它的成员等等。我可能从来没有想过在没有你指出的情况下尝试它! (2认同)