将模板的模板成员类型作为模板模板参数传递

Passing a template's template member type as a template template argument

A class WithTTMember 有一个名为 TT.

的模板成员类型
struct WithTTMember {
    template<typename> using TT = void;
};

另一个classExpectTT取一个模板模板参数:

template< template<typename> typename TT >
struct ExpectTT {};

ExpectTT<WithTTMember::TT>可以实例化成功

第三个 class ExpectTWithTT 需要一个名为 TT 的模板成员类型的模板参数,并使用它实例化 ExpectTT:

template<typename T>
struct ExpectTWithTT {
    using X = ExpectTT<typename T::TT>;  // this doesn't compile
};

我希望 ExpectTWithTT<WithTTMember>::XExpectTT<WithTTMember::TT> 的类型相同。但是上面的代码编译失败。

我尝试根据编译器消息和我的直觉,使用 templatetypename 关键字的组合注入错误行,但我无法让它工作。

如何表达我想要的?

任何 C++ 版本都可以。

您应该使用 template 关键字来表明 T::TT 是一个模板。

template<typename T>
struct ExpectTWithTT {
    using X = ExpectTT<T::template TT>;
    //                    ^^^^^^^^
};