我正在尝试使用模板创建一个可以表示不同类型图像的类。为此,我创建了一个通用基类(永远不应该初始化),其中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
。它添加了另一个模板参数,用于定义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
- 图像。但是,当我调用output->width
等时,我得到错误 C2248:'Image :: width':无法访问类'Image'中声明的私有成员
的。
我也无法访问其他专业的其他私人成员。 output->foo = 42
(见上文)throws 无法访问类'ColorImage'中声明的私有成员。我知道我可以通过将所有完全特化声明为部分特化的friend
来解决这个问题,然而,这将导致大量friend
- 声明,因为我必须为每个人做到这一点单个完整专业化(针对每个可能的颜色空间)。我也知道我可以宣布像公共setFoo (int value)
这样的东西,但我不想这样做,因为我不想将变量暴露给公众。还有另一种方法可以达到这个目的吗?
提前多多感谢。
答案 0 :(得分:0)
尝试使用ColorImage
派生public
以获取对其受保护成员的访问权限:
template<ColorSpace C>
class ColorImage<unsigned char, C> : public Image<unsigned char> {
// ...
};
有关C ++继承的更多信息on this SO post。