访问专用模板的私有/继承成员变量
Accessing private/inherited member variables of specialized template
我正在尝试创建一个可以使用模板表示不同类型图像的类。为此,我创建了一个通用基类(不应初始化),其中模板参数定义了像素值的存储方式(主要是float
或unsigned 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
。它添加了另一个模板参数,用于定义图像的颜色空间:
// 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:"图像::宽度":无法访问在类"图像"中声明的私有成员.
我也无法访问其他专业的其他私人成员。 output->foo = 42
(见上文)抛出无法访问在类"ColorImage"中声明的私有成员。我知道我可以通过声明所有完全专业化作为部分专业化的friend
来解决这个问题,但是,这将导致大量的friend
声明,因为我必须为每个完整的专业化(对于每个可能的色彩空间)这样做。我也知道我可以声明类似公共setFoo (int value)
的东西,但我也不想这样做,因为我不想向公众公开变量。有没有其他方法可以实现这一目标?
提前非常感谢。
尝试使用 public
派生ColorImage
以获取对其受保护成员的访问权限:
template<ColorSpace C>
class ColorImage<unsigned char, C> : public Image<unsigned char> {
// ...
};
有关此SO帖子中C++继承的更多信息。
相关文章:
- 为什么我可以通过SubBase类的公共继承方法打印出基类的私人继承成员
- 派生类调用使用非继承成员的继承函数
- 如果存在具有不同参数的继承成员,为什么对 C++ 结构函数的调用不明确?
- C :原始成员与继承成员的优先级
- 更改继承成员的地址
- C 是否可以不继承成员
- 使用模板的继承阴影继承成员
- 继承成员功能的模板专业化
- 不允许继承成员,为什么
- 派生模板类和继承成员变量的语法谜题
- 继承成员地址的C++标准
- 多级继承成员访问
- 访问专用模板的私有/继承成员变量
- 基模板继承成员,减少所需的类型
- 继承成员函数指针
- 模板专用化类不继承成员
- C++14正在初始化类构造函数初始化列表中的继承成员
- 具有专门初始化的继承成员变量
- 模板继承成员字段
- 访问数据成员的继承成员函数