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++,因为我认为别名模板是另一个模板的别名,就像类型别名是另一个类型的别名一样。
有人可以启发我并为我提供一些见解吗?
在此先感谢您的帮助 ...