警告C4150尝试包装本机c+;时删除指向不完整类型的指针+;班 我试图在C++中使用一个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(); } };

警告C4150尝试包装本机c+;时删除指向不完整类型的指针+;班 我试图在C++中使用一个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(); } };,c++,c++-cli,C++,C++ Cli,请参阅上面指示行的注释 我曾尝试在 MyManagedClass .CPP < /C>中明确地写一个析构函数和终结符。如果我在C++中遇到类似的问题,但我不会这样做,但它似乎没有解决问题。 我发现如果我让成员句柄而不是使用栈语义,那么我就不再得到警告: // MyManagedClass.h #include "NativeWrapper.h" // forward declaration class MyNativeClass; ref class MyManagedClass {

请参阅上面指示行的注释


我曾尝试在<代码> MyManagedClass .CPP < /C>中明确地写一个析构函数和终结符。如果我在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();
}
//MyManagedClass.h
#包括“NativeWrapper.h”
//远期申报
MyNativeClass类;
参考类MyManagedClass{
NativeWrapper^my\u native\u class\u0;
公众:
MyManagedClass();
无效剂量();
};
//MyManagedClass.cpp
#包括“MyManagedClass.h”
#包括“MyNativeClass.h”
MyManagedClass::MyManagedClass()
:my_native_class(gcnew NativeWrapper((std::make_unique()){}
void MyManagedClass::doSomething(){
我的母语->doSomething();
}
所以,我想这是可以的


但我不确定自己是否完全理解其中的原因。根据“当您使用堆栈语义创建引用类型的实例时,编译器会在垃圾收集堆上内部创建该实例(使用gcnew)”.

我相信析构函数确实不能在这里调用。您的设计问题是,通过向前声明MyNativeClass,您试图将本机包装器与pimpl惯用用法结合起来,而pimpl惯用用法无法模板化。@Eugene这个包装器不是类似于已模板化并可在中使用的
共享\u ptr
唯一\u ptr
皮姆普尔成语。
Warning C4150 deletion of pointer to incomplete type 'MyNativeClass'; no destructor called
// 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();
}