具有转发声明的不完整类型的唯一ptr赢得';不编译 我试图遵循C++的piml习惯用法。因此,我创建了一个类AgeDetect,它将是我面向用户的界面,并且AgeDetectImpl包含所有实现。我正向声明AgeDetectImpl,并使用std::unique\u ptr将其存储为AgeDetect的私有成员。我按照问题中的说明执行了析构函数,所以我不确定问题出在哪里
具有转发声明的不完整类型的唯一ptr赢得';不编译 我试图遵循C++的piml习惯用法。因此,我创建了一个类AgeDetect,它将是我面向用户的界面,并且AgeDetectImpl包含所有实现。我正向声明AgeDetectImpl,并使用std::unique\u ptr将其存储为AgeDetect的私有成员。我按照问题中的说明执行了析构函数,所以我不确定问题出在哪里,c++,unique-ptr,incomplete-type,C++,Unique Ptr,Incomplete Type,AgeDetect.h #ifndef AGE_DETECT_H #define AGE_DETECT_H #include <memory> #include <opencv2/opencv.hpp> class AgeDetect { class AgeDetectImpl; std::unique_ptr<AgeDetectImpl> m_ageDetectImplPtr = nullptr; public: AgeDetec
AgeDetect.h
#ifndef AGE_DETECT_H
#define AGE_DETECT_H
#include <memory>
#include <opencv2/opencv.hpp>
class AgeDetect {
class AgeDetectImpl;
std::unique_ptr<AgeDetectImpl> m_ageDetectImplPtr = nullptr;
public:
AgeDetect(std::string token);
~AgeDetect();
std::string getAge(std::string imagepath);
std::string getAge(uint8_t* buffer, size_t rows, size_t cols);
std::string getAge(const cv::Mat& image);
};
#endif
错误消息
error: invalid application of ‘sizeof’ to incomplete type ‘AgeDetect::AgeDetectImpl’
static_assert(sizeof(_Tp)>0,
编辑
固定收割台防护装置正如CuriouslyRecurringThroughts和Jarod42所述,该问题是由于将
nullptr
分配给m_ageDetectImplPtr
下面的代码可以工作
class AgeDetectImpl;
class AgeDetect {
public:
AgeDetect(std::string token);
~AgeDetect();
std::string getAge(std::string imagepath);
std::string getAge(uint8_t* buffer, size_t rows, size_t cols);
std::string getAge(const cv::Mat& image);
private:
std::unique_ptr<AgeDetectImpl> m_ageDetectImplPtr;
};
class-AgeDetectImpl;
类年龄检测{
公众:
AgeDetect(std::字符串令牌);
~AgeDetect();
std::string getAge(std::string imagepath);
字符串获取(uint8*buffer、大小行、大小列);
std::string getAge(const-cv::Mat和image);
私人:
std::唯一的_ptrm_agedetectimplpr;
};
您需要一个pimpl删除器:另外,您的标题保护\uuuu AGE\u DETECT\u H\uuu
是一个保留标识符,因为它有两个下划线,也因为它在全局(预处理器)范围内以下划线开头。@Eljay您能详细说明什么是pimpl删除器吗?从这个线程来看,我的包装器类需要删除一个,而我的类需要删除~AgeDetect()代码>@Eljay,谢谢你提供了关于头罩的信息,我修正了它可以在开始时分配给nullptr吗?目前无法轻松访问编译器
class AgeDetectImpl;
class AgeDetect {
public:
AgeDetect(std::string token);
~AgeDetect();
std::string getAge(std::string imagepath);
std::string getAge(uint8_t* buffer, size_t rows, size_t cols);
std::string getAge(const cv::Mat& image);
private:
std::unique_ptr<AgeDetectImpl> m_ageDetectImplPtr;
};