C++ cli C++;/CLI无法访问基类的受保护成员

C++ cli C++;/CLI无法访问基类的受保护成员,c++-cli,C++ Cli,我有这门课: ref class Wrapper { protected: Native *pn; public: Wrapper(int val) { pn = new Native( val ); } }; 然后我从中得出: ref class DerivedWrapper : public Wrapper{ public: DerivedWrapper(int val) {pn = new DerivedNative(val)

我有这门课:

ref class Wrapper {
protected:
            Native *pn;

public:
            Wrapper(int val) { pn = new Native( val ); }

};
然后我从中得出:

ref class DerivedWrapper : public Wrapper{
public: 
    DerivedWrapper(int val) {pn = new DerivedNative(val); }
}
编译器抱怨: 错误C2248“Wrapper::pn”:无法访问类“Wrapper”中声明的私有成员

基类本机指针显然受到保护,派生类应该可以随时访问它。我所有的直觉告诉我这应该行得通。ref类有什么特别之处吗


我是使用VS 2008 SP 1编译的

在您的情况下,本机类型必须在编译的程序集中具有公共或受保护的可访问性。有一个特殊的
make_public
pragma指令可以提升本机类型。将此添加到代码中:

#pragma make_public(Native)

make_public
pragma记录在

考虑在包装器的构造函数中初始化pn,或者您需要为包装器提供默认构造函数。不要忘记ref类定义中的“public”

public ref class Wrapper {
protected:
  Native *pn;
  Wrapper(Native * fpn):pn(fpn)
  {}
public:
  Wrapper(int val) { pn = new Native( val ); }
};

ref class DerivedWrapper : public Wrapper{
public: 
  DerivedWrapper(int val):Wrapper(new DerivedNative(val)){}
};

这两个类在同一个程序集中吗?否则,不允许(直接)从基类程序集中导出
Native
的类型,编译器将隐式地将其更改为private。但如果发生这种情况,您将得到警告。为什么不调用DerivedWrapper构造函数中的基构造函数来初始化该字段?您需要公共引用类