微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在模板化父类中访问模板化“使用”

如何解决在模板化父类中访问模板化“使用”

我有一个这样的类层次结构:

/* 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;
};

Demo

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。