【问题标题】:Error "field has incomplete type"错误“字段类型不完整”
【发布时间】:2013-04-03 14:58:24
【问题描述】:

我正在尝试编写 IplImage 包装器。

这是我的代码:

class DrawingDetector
{
public:
    typedef boost::shared_ptr<IplImage> ipl_image_ptr_t;

    DrawingDetector(){}
    DrawingDetector::DrawingDetector(IplImage* img) : m_image(img, ipl_deleter){}

private:

    static void ipl_deleter( IplImage* ipl_img )
    {
        if( ipl_img )
        {
            cvReleaseImage( &ipl_img );
        }
    }

    ipl_image_ptr_t m_image; // compiler error "field ‘m_image’ has incomplete type"

};

我收到以下编译错误“字段‘m_image’的类型不完整”。 我的编译器是 gcc 4.4。

为什么我不能创建一个空的 shared_ptr?

【问题讨论】:

  • 你能添加你的包含吗?
  • 只是一个旁注:你的构造函数只需要一个普通的指针,而在你的类中,你拥有 IplImage 的所有权,带有 shared_ptr 和一个自定义删除器。这意味着您将 IplImage 的构造与其删除分开,但两者应该是一致的。解决方案:将构造函数参数设为shared_ptr 本身。这样你就可以把IplImage 的构造和销毁留给调用者了。此外,它在你的类的接口中明确声明,你拥有图像的共享所有权,这是一件好事。

标签: c++ opencv wrapper shared-ptr


【解决方案1】:

由于该字段的类型为boost::shared_ptr&lt;IplImage&gt;,因此您似乎没有包含boost/shared_ptr.hpp 和/或定义IplImage 的标头。对于IplImage,只提供一个前向声明就足够了。

【讨论】:

    【解决方案2】:

    编译器看不到 boost 共享 ptr 或 IplImage 定义。您应该包含相应的标题

    【讨论】:

      【解决方案3】:

      “不完整类型”是指已声明但未定义的类型。这可能意味着您不包括提供定义的boost/shared_ptr.hpp

      【讨论】:

        猜你喜欢
        • 2012-09-10
        • 2011-04-29
        • 2016-09-07
        • 1970-01-01
        • 2018-05-11
        • 2012-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多