using宣言でユーザー定義の変換テンプレートを参照することはできますか?


8

class Bから継承するクラスAでは、次のように、using宣言を使用してのメンバーAB、さらにはテンプレートに含めることができます。

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

テンプレートを名前で参照する方法はないようですが、間違っていることが判明するか、説明が必要です。


1
ユースケースは何ですか?
R Sahu

@RSahuおそらくパブリック継承を必要とせずに変換コンストラクタを継承します。
Ayjay、

@Ayjay、そうだとすれば、private継承の使用はよく考えられていません、IMO。
R Sahu

@RSahu Ayjayは正しいです。具体的には、私はいくつかのクラスを許可したいCから継承しBますが、CアクセスしていないはずAの保護方法を。ただし、Aこの変換演算子を含め、のパブリックメソッドをパブリックのままにしておく必要があります。私はいくつかの方法でこれを回避できることを知っていますが、そのような小さな利益のために余分なコードを書くことは避けたいです。
リンゴ

@Apples、それは設計上の欠陥のようです。これらのクラスをどの程度制御できるかわかりません。何が行われるかを制御Aできる場合はA、2つのクラスに分けることができます。1つはlyをB継承できるクラスpublicで、もう1つはlyを継承できるクラスprivateです。
R Sahu

回答:


3

回避策として、基本クラスにキャストして明示的に変換できます。

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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.