首页 > 解决方案 > 无法调用基类成员函数,因为基类是模板化的

问题描述

是否有某种限制,如果基类是模板化的,我们不能在派生类中调用它的成员函数?这不会违反开车离开它的全部目的吗?有解决办法吗?

这是我演示问题的示例:

这些类驻留在类库中。

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();
    }
};

标签: c++.netc++-cli

解决方案


您有访问问题:

您可能会更改protectedpublic

template<class T>
class Base
{
public:

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

推荐阅读