问题描述
类 WithTTMember
具有名为 TT
的模板成员类型。
struct WithTTMember {
template<typename> using TT = void;
};
另一个类 ExpectTT
采用模板模板参数:
template< template<typename> typename TT >
struct ExpectTT {};
ExpectTT<WithTTMember::TT>
可以成功实例化。
第三个类 ExpectTWithTT
需要一个模板参数,模板成员类型名为 TT
,并使用它实例化 ExpectTT
:
template<typename T>
struct ExpectTWithTT {
using X = ExpectTT<typename T::TT>; // this doesn't compile
};
我希望 ExpectTWithTT<WithTTMember>::X
与 ExpectTT<WithTTMember::TT>
的类型相同。但是上面的代码无法编译。
我尝试在编译器消息和我的直觉之后使用 template
和 typename
关键字的组合注入错误的行,但我无法让它工作。
如何表达我想要的?
任何 C++ 版本都可以。
解决方法
您应该使用 template
关键字来说明 T::TT
是一个模板。
template<typename T>
struct ExpectTWithTT {
using X = ExpectTT<T::template TT>;
// ^^^^^^^^
};