C++ 无法调用基类成员函数,因为基类已模板化
如果基类是模板化的,我们就不能在派生类中调用它的成员函数,这有什么限制吗?这难道不违背开车的全部目的吗?有解决办法吗 下面是我的示例来说明问题: 这些类驻留在类库中C++ 无法调用基类成员函数,因为基类已模板化,c++,.net,c++-cli,C++,.net,C++ Cli,如果基类是模板化的,我们就不能在派生类中调用它的成员函数,这有什么限制吗?这难道不违背开车的全部目的吗?有解决办法吗 下面是我的示例来说明问题: 这些类驻留在类库中 namespace CLRLib { class A { public: }; public ref class SimpleBase { public: void Hello() { cout <<
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:“Hello”:不是“CLRLib::派生”的成员
更新
我确认它与基类是模板类有关。我已经更新了上面的代码。当我从一个没有模板的简单基类派生时,基类函数是可用的,我可以调用它,但如果基类使用模板,它是不可访问的
更新2
如果我在派生类成员函数中调用Hello,那么我也可以在主程序中调用它。但这并不能解决问题
public ref class Derived : public Base <A>
{
public:
void Print()
{
cout << "Derived::Print called" << endl;
Hello();
}
};
您有访问权限问题:
您可以将“受保护”更改为“公共”:
我认为这与基地被模板化无关。您无法访问自己的类和子类范围之外的protectedmember。我建议您在使用它之前先查看protected的含义。@George您是对的。让我更新这个问题。最初我与CLI有问题,但在C++中做了一个例子,尝试用修改的DEMO来产生问题。当你有一个不同的问题比你发布的一个更好的是创建一个新的问题,因此,我建议您恢复编辑以恢复旧状态,并将新问题作为新问题发布模板没有外部链接,这在C++/CLI中不会变得更好。您需要使用头文件,就像C++中那样,或者用泛型关键字创建泛型类型。后者是非常推荐的,因为托管类型标识包括它定义的程序集。很抱歉,我在匆忙中忽略了受保护的部分。我将修改我的问题。避免修改使现有答案无效的问题:-/最好再问一个问题。
template<class T>
class Base
{
public:
void Hello()
{
cout << "Base::Hello() called" << endl;
}
};