C++:修复类模板特化/继承问题

标签 c++ templates inheritance

上下文

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

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

我的需求

目前我的需要是转换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

但在第二个答案中:

Explicitly specializing functions is never (almost never?) the right way. In my work as a programmer, I've never explicitly specialized a function template. Overloading and partial ordering is superior.

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

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<cv::Mat>之前:

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

但我得到:

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

需要帮助!

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

  1. 如何修复最后一段代码?
  2. 是否有针对此类问题的推荐解决方案?

感谢您的帮助! :)

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

最佳答案

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

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;
};

关于C++:修复类模板特化/继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29499099/

相关文章:

c++ - 如何处理 matchShapes() 函数的输出

c++ - 我们可以使用检测成语来检查类是否具有具有特定签名的成员函数吗?

inheritance - 在 Objective-C++ 应用程序中接收 C++ 虚拟方法调用的正确方法是什么?

具有相同函数名的 C++ 继承

c++ - C++中的析构函数概念

c++ - 使用 fstream 将其他文件保存在自己的数据存储中

c++ - Typedef 用于指向 C++ 中的 C 函数的指针

java - 运算符优先级,哪个结果是正确的?

c++ - 如何将析构函数专门用于一种情况或某些情况?

php - Smarty 日期和时间比较