繁体   English   中英

警告C4150在尝试包装本机c ++类时删除指向不完整类型的指针

[英]Warning C4150 deletion of pointer to incomplete type when trying to wrap native c++ class

我正在尝试在C ++ / CLI中编写一个ref类模板,该模板可用于根据此处的建议包装本机C ++类型。 这是我到目前为止:

template<class T>
public ref class NativeWrapper {
  T* ptr_;

protected:
  !NativeWrapper() { delete ptr_; }  // <-- C4150 Warning here!

public:
  NativeWrapper(std::unique_ptr<T> ptr) : ptr_(ptr.release()) {}

  T* get() { return ptr_; }
  T* operator->() { return ptr_; }

  ~NativeWrapper() { NativeWrapper::!NativeWrapper(); }
};

然后我想将它用作ref类中的成员,但我想在.h文件中使用本机类的前向声明:

// MyManagedClass.h

#include "NativeWrapper.h"

// forward declaration
class MyNativeClass;

ref class MyManagedClass {
  NativeWrapper<MyNativeClass> my_native_class_;
public:
  MyManagedClass();
  void doSomething();
};

// MyManagedClass.cpp    

#include "MyManagedClass.h"
#include "MyNativeClass.h"

MyManagedClass::MyManagedClass() : my_native_class_(std::make_unique<MyNativeClass>()) { }

void MyManagedClass::doSomething() {
  my_native_class->doSomething();
}

似乎正确调用了本机类的析构函数,但是我得到以下警告:

Warning C4150 deletion of pointer to incomplete type 'MyNativeClass'; no destructor called

请参阅上面一行的注释。

我已经尝试在MyManagedClass.cpp显式编写析构函数和终结器,如果我在本机c ++中遇到类似问题但我似乎无法解决问题。

我发现如果我使成员成为句柄而不是使用堆栈语义,那么我就不再收到警告了:

// MyManagedClass.h

#include "NativeWrapper.h"

// forward declaration
class MyNativeClass;

ref class MyManagedClass {
  NativeWrapper<MyNativeClass>^ my_native_class_;
public:
  MyManagedClass();
  void doSomething();
};

// MyManagedClass.cpp    

#include "MyManagedClass.h"
#include "MyNativeClass.h"

MyManagedClass::MyManagedClass() 
: my_native_class_(gcnew NativeWrapper<MyNativeClass>((std::make_unique<MyNativeClass>())) { }

void MyManagedClass::doSomething() {
  my_native_class->doSomething();
}

所以,我认为没关系。

我不确定我完全理解为什么。 根据这个 “当你使用堆栈语义创建引用类型的实例时,编译器会在垃圾收集堆上内部创建实例(使用gcnew)”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM