首页 文章

访问专用模板的私有/继承成员变量

提问于
浏览
0

我正在尝试使用模板创建一个可以表示不同类型图像的类 . 为此,我创建了一个通用基类(永远不应该初始化),其中template参数定义了像素值的存储方式(主要是 floatunsigned char ) .

// Image.h

#pragma once

template<typename T>
class Image
{
public:
    Image () : width (0), height (0), allocatedMemory (0), data (nullptr) {}
    virtual ~Image () { delete [] data; }

protected:
    int width;           // in pixel
    int height;          // in pixel
    int allocatedMemory; // number elements in data
    T* data;             // image data
};

现在,我有另一个类 ColorImage ,它派生自 Image . 它添加了另一个模板参数,用于定义Image的颜色空间:

// ColorImage.h

#pragma once

#include "Image.h"

/**
*   Defines various color spaces.
*   Declared outside of class because of template.
**/
enum class ColorSpace 
{ 
    CS_GRAY = 0, CS_RGB, CS_BGR, CS_HSV, CS_LAB, CS_RGBA, CS_BGRA, CS_ARGB
};

template<typename T, ColorSpace C>
class ColorImage;


// Specialise for T = unsigned char

template<ColorSpace C>
class ColorImage<unsigned char, C> : Image<unsigned char>
{
public:
    ColorImage  () : Image () {}
    ~ColorImage () {}

    template<ColorSpace D>
    void convert (ColorImage<unsigned char, D>* output)
    {
        output->width = width;    // error
        output->height = height;  // error
        output->allocatedMemory = allocatedMemory;  // error

        output->foo = 42;  //error

        // ... output->data handling here ...
    }

private:
    int foo;
};

convert() 函数中,我想将一个颜色空间转换为另一个颜色空间 . 为此,我想将原始图像中的所有数据复制到 output -Image . 但是,当我调用 output->width 等等时,我得到错误C2248:'Image :: width':无法访问类'Image'中声明的私有成员 .

我也无法访问其他专业的其他私人成员 . output->foo = 42 (见上文)throws无法访问类'ColorImage'中声明的私有成员 . 我知道我可以通过将所有完全特化声明为部分特化的 friend 来解决这个问题,然而,这将导致大量的 friend -声明,因为我必须为每一个完整的特化(对于每种可能的颜色)都这样做空间) . 我也知道我可以宣布像公共 setFoo (int value) 这样的东西,但我不希望将变量暴露给公众 . 有没有另一种方法来实现这一目标?

非常感谢提前 .

1 回答

  • 0

    尝试使用 public 派生 ColorImage 以获取对其受保护成员的访问权限:

    template<ColorSpace C>
    class ColorImage<unsigned char, C> : public Image<unsigned char> {
        // ...
    };
    

    有关C继承的更多信息on this SO post .

相关问题