1

Derived<T>から継承しBase<T>ます。Derived<T>::mオブジェクトを返す必要がありDerived<T>::Innerます。何が間違っているのか、私にはわかりません。

次のコードを検討してください。

template <typename T>
class Base {
public:
    class Inner {
    public:
        virtual void x() = 0;
    };
    virtual Inner m(std::string arg) = 0;
};

template <typename U>
class Derived : Base<U> {
public:

    class Inner : Base<U>::Inner {
    public:
        virtual void x();
    };
    virtual Inner m(std::string arg);
};

template <typename U>
Derived<U>::Inner Derived<U>::m(std::string arg) {
    std::cout << "calling Derived::m() " << arg << std::endl;
    return new Inner();
}

template <typename U>
void Derived<U>::Inner::x() {
    std::cout << "calling x" << std::endl;
}

Derived<std::string>* d = new Derived<std::string>();
Derived<std::string>::Inner* inner = d->m("test");
inner->x();

次のエラーが表示されます。

invalid covariant return type for 
   'Derived<U>::Inner Derived<U>::m(std::string) [with U = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]'
overriding 'Base<T>::Inner Base<T>::m(std::string) [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]'
4

1 に答える 1

1

戻り値の型に基づいて関数をオーバーライドしようとしています。クラスBase::Innerは と同じではないため、派生クラスから基本クラスDerived::Innerのメソッドをオーバーライドすることはできません。m

クラスのmメソッドはを返す必要があります。ただし、それはオブジェクトのスライスにつながるため、直接行うことはできません。代わりに、参照またはポインターを返す必要があります。DerivedBase::Inner

を使用して、後者をお勧めしstd::unique_ptrます。

たぶん次のようなもの:

template<typename U>
class Base
{
public:
    class Inner { ... };

    using inner_ptr = std::unique_ptr<Base<U>::Inner>;

    virtual inner_ptr m(const std::string&) = 0;
};

template<typename U>
class Derived : public Base<U>
{
public:
    Base<U>::inner_ptr m(const std::string&);

    class LocalInner : public Base<U>::Inner { ... };
};

template<typename U>
inline Base<U>::inner_ptr m(const std::string& arg)
{
    return Base<U>::inner_ptr(new LocalInner);
}
于 2013-06-13T10:44:00.110 に答える