我想創建一個類,可以通過使用模板來表示不同類型的圖像。爲此,我創建了一個通用的基類(不應初始化),其中模板參數定義應如何存儲像素值(主要爲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:'Image :: width':無法訪問在'Image' 中聲明的私有成員。
我也無法訪問其他專業的其他私人會員。 output->foo = 42
(見上)拋出無法訪問類'ColorImage'中聲明的私有成員。我知道我可以通過聲明所有完全專業化爲friend
來解決這個問題,但是,這將導致大量的friend
-聲明,因爲我必須爲每一個完全專業化(對於每種可能的顏色空間)。我也知道我可以聲明像公衆setFoo (int value)
,但我不想這樣做,因爲我不想將變量暴露給公衆。是否有另一種方法來實現這一點?
非常感謝。
在這種情況下,這不是問題。問題在於'TemplateType'與'TemplateType '無關,除了代碼中的文字外觀。 –
2015-01-26 19:30:06
啊我明白了。好點,馬克。 – erapert 2015-01-26 19:48:59