Невозможно вызвать функции-члены базового класса, потому что базовый класс является шаблонным - PullRequest
0 голосов
/ 25 апреля 2020

Существуют ли какие-то ограничения на то, что если базовый класс является шаблонным, мы не можем вызывать его функции-члены в производном классе? Разве это не нарушит всей цели вождения от него? Есть ли решение?

Вот мой пример, чтобы продемонстрировать проблему:

Эти классы находятся в библиотеке классов.

namespace CLRLib {

    class A
    {
    public:

    };

    public ref class SimpleBase
    {
    public:

        void Hello()
        {
            cout << "SimpleBase::Hello() called" << endl;
        }

    };

    public ref class DerivedFromSimple : public SimpleBase
    {
    public:

        void Print()
        {
            cout << "Derived::Print called" << endl;
        }
    };


    template<class T>
    public ref class Base
    {
    public:
        T* m_Instance;

        void Hello()
        {
            cout << "Base::Hello() called" << endl;
        }

        T* GetInstance()
        {
            return m_Instance;
        }

    };

    public ref class Derived : public Base <A>
    {
    public:

        void Print()
        {
            cout << "Derived::Print called" << endl;
        }
    };
}

А это консольное приложение драйвера. Обратите внимание, что проблема НЕ возникает, если они оба находятся в одном проекте C ++ / CLI!

int main(cli::array<System::String ^> ^args)
{
    Derived d;

    d.Print(); // yes
    //d.Hello(); // Doesn't compile, don't recognize the function.

    DerivedFromSimple d2;
    d2.Print();
    d2.Hello(); // Ok now

    return 0;
}

Опять же, я могу создать только , если классы находятся в отдельном C ++ / CLI. Библиотека NET и приложение драйвера - это отдельное консольное приложение C ++ / CLI. Я не могу вызвать методы базового класса в этой конфигурации, потому что они находятся в разных сборках? И да, никаких проблем, если они находятся в одной сборке! Довольно странно.

Сообщение об ошибке:

ошибка C2039: «Привет»: не является членом «CLRLib :: Derived»

Обновление

Я подтвердил, что это связано с тем, что базовый класс является классом шаблона. Я обновил код выше. Когда я наследую простой базовый класс (без шаблона), функция базового класса доступна, и я могу вызывать ее, но она недоступна, если базовый класс использует шаблон.

Обновление 2

Если я вызову Hello () в производной функции-члене класса, то я также могу вызвать ее в основной программе. Но это не решает проблему.

public ref class Derived : public Base <A>
{
public:

    void Print()
    {
        cout << "Derived::Print called" << endl;

        Hello();
    }
};

1 Ответ

1 голос
/ 25 апреля 2020

У вас есть проблема с доступом:

Вы можете изменить protected на public:

template<class T>
class Base
{
public:

    void Hello()
    {
        cout << "Base::Hello() called" << endl;
    }
};
...