警告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
中明确编写destructor和cinterizer,这是我在本机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)上创建实例。
相关文章:
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 从类型列表中递归删除重复项会导致编译器堆空间错误 (VS2017)
- 为什么 std::make_shared 无法编译带有已删除运算符 new 的类型?
- 将类型添加到现有模板而不删除 c++17
- 删除[]具有不同类型的未定义行为?
- 创建模板类型而不新建/删除
- 从 Typedef 数据类型中删除常量
- 当类型适当的构造函数可用时,为什么一个编译器尝试使用已删除的副本构造函数
- 删除对象(具有不同类型)的引用时会发生什么情况?
- 根据模板类型有条件地删除变量
- 从浮点数中删除小数部分但保留类型的有效方法
- 从自定义数据类型向量中删除重复元素
- C++ 模板<类型名 T> 删除
- 错误:在类型 "blah blah" 的绑定引用中删除限定符以初始化"some other blah blah"
- 为什么许多标准库类型在 C++20 中删除 operator!=?
- 如何从指针类型和指针到指针类型中删除__unaligned说明符
- 为什么在某些情况下从函数返回类型中删除 cv 限定符?
- C++ - 按自定义数据类型向量的值删除元素
- c ++ 我是否需要手动删除指向另一个具体类型的 void* 指针?
- 如何删除类内类类型的类成员指针