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