Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有转发声明的不完整类型的唯一ptr赢得';不编译 我试图遵循C++的piml习惯用法。因此,我创建了一个类AgeDetect,它将是我面向用户的界面,并且AgeDetectImpl包含所有实现。我正向声明AgeDetectImpl,并使用std::unique\u ptr将其存储为AgeDetect的私有成员。我按照问题中的说明执行了析构函数,所以我不确定问题出在哪里_C++_Unique Ptr_Incomplete Type - Fatal编程技术网

具有转发声明的不完整类型的唯一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;
    };