gpt4 book ai didi

c++ - 尝试包装 native C++ 类时警告 C4150 删除指向不完整类型的指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:11:18 25 4
gpt4 key购买 nike

我正尝试在 C++/CLI 中编写一个 ref 类模板,该模板可用于根据建议包装原生 C++ 类型 here .这是我目前所拥有的:

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 文件中为 native 类使用前向声明:

// 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();
}

native 类的析构函数似乎被正确调用,但我收到以下警告:

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

请参阅指示上面一行的注释。

我已经尝试在 MyManagedClass.cpp 中显式编写一个析构函数和一个终结器,如果我在 native 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();
}

所以,我认为这没问题。

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

关于c++ - 尝试包装 native C++ 类时警告 C4150 删除指向不完整类型的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41072246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com