如何解决在模板化父类中访问模板化“使用”
/* Base templated interface class */
template <class T>
class InterfaceClass {
public:
// normal using sentence
using InnerType1 = SomeClass<T>;
// HERE1: Templated using sentence that I want to use in other places
template<typename SomeType>
using TplInnerType = SomeOtherClass<InnerType1,SomeType>;
};
/* Some templated intermediate class inheriting from the interface */
template <typename T>
class Class : InterfaceClass<T> {
public:
using BaseType = InterfaceClass<T>;
// This works
using typename BaseType::InnerType1;
// HERE2: This won't work in any form
using typename BaseType::TplInnerType;
};
/* Then I have some children using the CRTP as: */
class Child1 : Class<Child1> { ... };
class Child2 : Class<Child2> { ... };
我想在后代 (HERE2) 中使用 InterfaceClass 中的模板化 using 句子 (HERE1),但我无法让编译器(C++11 over clang 10)来解析类型。 我按照编译器的建议尝试了很多组合,包括:
template <typename U> using typename BaseType::TplInnerType<U>;
template <typename U> using TplInnerType = BaseType::TplInnerType<U>;
template <typename U> using TplInnerType = typename BaseType::TplInnerType<U>;
template <typename U> using TplInnerType = BaseType::template TplInnerType<U>;
但是建议让我绕了一圈……我尝试做的事情可能吗?
编辑 - 另一个解决方案
除了 @Jarod42 answer,它适用于这个玩具示例但不适用于我的真实案例,我找到了另一个有效的解决方案 (sample):
template <typename T>
class Class : InterfaceClass<T> {
public:
using BaseType = InterfaceClass<T>;
using typename BaseType::InnerType1;
// This works
template <typename U>
using TplInnerType = typename BaseType::template TplInnerType<U>;
};
解决方法
你应该删除typename
:
template <typename T>
class Class : public InterfaceClass<T> {
public:
using BaseType = InterfaceClass<T>;
using typename BaseType::InnerType1;
using BaseType::TplInnerType;
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。