【问题标题】:Is it possible to refer to a user-defined conversion template in a using declaration?是否可以在 using 声明中引用用户定义的转换模板?
【发布时间】:2020-02-18 04:27:47
【问题描述】:

在继承自类A 的类B 中,可以使用using 声明将A 的成员带入B,甚至是模板,如下所示:

struct A {
    template <typename T>
    void foo();
};

struct B : private A {
    using A::foo;
};

但是转换模板可以做到吗?

struct A {
    template <typename T>
    operator T();
};

struct B : private A {
    using A::operator /* ??? */;
};

似乎无法通过名称引用模板,但我希望被证明是错误的或得到一些澄清。

【问题讨论】:

  • 用例是什么?
  • @RSahu 大概是为了继承转换构造函数而不需要公共继承。
  • @Ayjay,如果是这样,那么使用 private 继承是错误的,IMO。
  • @RSahu Ayjay 是正确的。更具体地说,我想允许某些类C 继承自B,但C 不应访问A 的受保护方法。但是,我希望A 的公共方法保持公开,包括这个转换运算符。我知道我可以通过几种方式解决这个问题,但我宁愿避免编写额外的代码来获得这么少的好处。
  • @Apples,这似乎是设计缺陷。我不知道你对这些课程有多少控制权。如果您可以控制 A 中的内容,则可以将 A 分为两个类 - 一个类 B 可以继承 publicly 和另一个类 privately。

标签: c++ inheritance language-lawyer using-declaration conversion-operator


【解决方案1】:

作为一种解决方法,您可以强制转换为基类并显式转换:

struct A {
    template <typename T>
    operator T() {
        return T{};
    }
};

struct B : private A {
    template <class T>
    operator T() {
        return static_cast<T>(static_cast<A&>(*this));
    }
};

int main() {
    A a;
    B b;
    int i_a = a;
    int i_b = b;
}

【讨论】:

    猜你喜欢
    • 2019-08-12
    • 1970-01-01
    • 2021-09-14
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多