c++ - 无法调用基类成员函数,因为基类是模板化的
问题描述
是否有某种限制,如果基类是模板化的,我们不能在派生类中调用它的成员函数?这不会违反开车离开它的全部目的吗?有解决办法吗?
这是我演示问题的示例:
这些类驻留在类库中。
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();
}
};
解决方案
您有访问问题:
您可能会更改protected
为public
:
template<class T>
class Base
{
public:
void Hello()
{
cout << "Base::Hello() called" << endl;
}
};
推荐阅读
- c# - 一个简单的余弦相似度
- reactjs - 排毒测试分配给未定义,所有e2e都被跳过
- java - Play Framework 2.7 神秘的 akka 异常
- java - 如何使 JTextField 的数字大于另一个 JTextField 的数字?
- javascript - 打印时显示每页的动态页眉
- android - 选定的点不会在android中滑动到下一页?
- python - Open CV - 在 Zoom 或 Skype/Stream 使用相机时每 X 秒捕获一帧 opencv 捕获的帧以使用 Python 进行缩放会议
- python - 尝试进行 INNER Join 并在 API 上显示结果
- angular - 为什么使用RouteReuseStrategy时路由动画消失
- python - 如何修改 pyqt5 消息框以永久显示按钮上的快捷键