前向声明为不完整类型的unique_ptr无法编译

时间:2019-06-26 21:56:07

标签: c++ unique-ptr incomplete-type

我正在尝试遵循C ++的PIMPL习惯用法。因此,我创建了一个类AgeDetect,它将是我的用户界面,而AgeDetectImpl则包含了所有实现。我正声明AgeDetectImpl,并使用std::unique_ptr将其存储为AgeDetect的私有成员。我遵循了this问题的说明,并实现了析构函数,因此我不确定问题出在哪里。

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

AgeDetect.cpp

#include "ageDetect.h"
#include "ageDetectImpl.h"

AgeDetect::~AgeDetect() = default;

AgeDetect::AgeDetect(std::string token) {
    //m_ageDetectImplPtr = std::make_unique<AgeDetectImpl>(token);
    }

错误消息

 error: invalid application of ‘sizeof’ to incomplete type ‘AgeDetect::AgeDetectImpl’
  static_assert(sizeof(_Tp)>0,

修改 固定头罩

1 个答案:

答案 0 :(得分:0)

正如CuriouslyRecurringThoughts和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;
    };