尝试记住传递到模板中的模板模板参数以供以后重用

chi*_*chi 6 c++ template-templates

我有一个似乎与模板模板参数有关的问题。以下代码(GodBolt.org 上的生命代码)可以使用 GCC 编译至 11.2,但无法使用 Clang++ 编译至 13.0.1。

问题似乎出在代码的最后两行。

HullWrapper我试图实现的是记住作为别名模板传递的模板模板参数HullWrapper以便以后可以重新使用它。

特别是在倒数第二行中,我想重新构建该类派生的基本模板HullClass。我通过专门化来尝试这个HullWrapper通过别名模板记住的模板参数来专门化模板来尝试此操作。

不幸的是,这在 Clang++ 中不起作用。然而,在 G++ 中却是这样。看来,对于 Clang++ a 来说,与传递给它的模板参数的别名模板HullWrapper<Hull>不同。HullWrapper<HullClass::HullType>HullTypeTHull

#include <type_traits>

template <typename T> struct Hull {};

template <template <typename> class T>
struct HullWrapper
{
  template <typename U> using HullType = T<U>;
};


struct HullClass : HullWrapper<Hull> {};


HullClass hullObj;
HullWrapper<Hull>* hullWrapperPtr2 = &hullObj;
HullClass* hullPtr =  &hullObj;

// Following two lines does not compile with Clang++
HullWrapper<HullClass::HullType>* hullWrapperPtr1 = &hullObj;
static_assert(std::is_same<HullWrapper<Hull>, HullWrapper<HullClass::HullType>>::value, "OUCH!");

Run Code Online (Sandbox Code Playgroud)

现在我想问一下,谁在这里?我会认为 G++,因为我认为别名模板是另一个模板的别名,就像类型别名是另一个类型的别名一样。

有人可以启发我并为我提供一些见解吗?

在此先感谢您的帮助 ...