Существуют ли какие-то ограничения на то, что если базовый класс является шаблонным, мы не можем вызывать его функции-члены в производном классе? Разве это не нарушит всей цели вождения от него? Есть ли решение?
Вот мой пример, чтобы продемонстрировать проблему:
Эти классы находятся в библиотеке классов.
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();
}
};