【问题标题】:C++: Fix class template specialization / inheritance issueC++:修复类模板特化/继承问题
【发布时间】:2015-04-07 18:55:41
【问题描述】:

上下文

我正在家里用 Qt 学习 C++。我正在使用该项目来学习设计实践。最近,我遇到了一种需求,促使我使用了模板。

我为 Qt 的 QPixmap 图片格式创建了一个 openGL 图片查看器。 我想在这个查看器中添加一个图片格式转换器。

我的需要

目前我需要将openCV的cv::Mat转换成QPixmap。 将来我可能会遇到其他格式(所以其他 C++ 类型)。所以我想到了模板。这是我的出发点:

template <class T>
class ToQPixmapConverter : public QObject
{
public:
    ToQPixmapConverter(QObject *parent = 0) : QObject(parent) {
        setRawPic(new T());
    }
    ~ToQPixmapConverter(){delete rawPic;}

    T *getRawPic() const {return rawPic;}
    void setRawPic(T *pRawPic) {rawPic = pRawPic;}

    // TO BE SPECIALIZED/OVERLOADED or something
    QPixmap *convert(T &pRawPic) {return nullptr;}
    QPixmap *convertFromPath(cv::String const path) {return nullptr;}

protected:
    T* rawPic;
    QPixmap localPixMap;
};

我想保持所有成员和大多数方法不变,所以我只需要为所有不同的格式实现convertconvertFromPath

我的失败尝试

部分模板专业化。 我挣扎了很长时间尝试不允许的东西,最后我找到了这个解决方案:Understanding (simple?) C++ Partial Template Specialization

但在第二个答案中:

明确地专门化函数从来都不是(几乎从来没有?)正确的 大大地。在我作为程序员的工作中,我从来没有明确专门化过 函数模板。重载和偏序更胜一筹。

从类模板继承。 我认为这是我需要的,但我无法实现:

class CvMatToQPixmapConverter : public ToQPixmapConverter<cv::Mat>{};

QPixmap * CvMatToQPixmapConverter::convert(cv::Mat &pRawPic)
{
    // Some stuff
}

QPixmap * CvMatToQPixmapConverter::convertFromPath(cv::String const path)
{
    // Some stuff
}

使用此代码,我得到:

error: no 'QPixmap* CvMatToQPixmapConverter::convert(cv::Mat&)' member function declared in class 'CvMatToQPixmapConverter'
 QPixmap * CvMatToQPixmapConverter::convert(cv::Mat &pRawPic)
                                                            ^

所以我之前尝试定义ToQPixmapConverter&lt;cv::Mat&gt;

template <>
class ToQPixmapConverter<cv::Mat>;

但我明白了:

error: invalid use of incomplete type 'class ToQPixmapConverter<cv::Mat>'
 class CvMatToQPixmapConverter : public ToQPixmapConverter<cv::Mat>{};
                                        ^

需要帮助!

我希望我提供了足够的背景信息,以便有人可以帮助我。 基本上,我的问题是。

  1. 你如何修复最后一段代码?
  2. 此类问题的推荐解决方案是什么?

感谢您的帮助! :)

PS:我最初的想法是将策略模式与类模板结合起来......但我失败了。在这里可以用吗?

【问题讨论】:

    标签: c++ templates inheritance


    【解决方案1】:

    我认为抽象基类和必要的具体子类将是比类模板更好的设计。

    class ToQPixmapConverter : public QObject
    {
       public:
          ToQPixmapConverter(QObject *parent = 0) : QObject(parent) {}
          ~ToQPixmapConverter(){}
    
          // TO BE OVERLOADED
          virtual QPixmap *convert() {return nullptr;}
          virtual QPixmap *convertFromPath(cv::String const path) {return nullptr;}
    
       protected:
    }
    
    class FromCVMatToQPixmapConverter : public ToQPixmapConverter
    {
       public:
          FromCVMatToQPixmapConverter(cv::Mat* rawPicIn, QObject *parent = 0) : ToQPixmapConverter(parent), rawPic(rawPicIn) {}
          ~FromCVMatToQPixmapConverter(){delete rawPic;}
    
          virtual QPixmap *convert() { /* Add code to do it*/ }
          virtual QPixmap *convertFromPath(cv::String const path) { /* Add code to do it*/ }
       private:
          cv::Mat* rawPic;
    };
    

    【讨论】:

    • 感谢您的回答!我想将rawPic 存储在基类/模板中,这让我想到了那些复杂的实现。但实际上我不认为这很有用。并且感谢您的解决方案,如果需要,我可以看到如何使用策略模式。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多