템플릿을 사용하여 다른 종류의 이미지를 나타낼 수있는 클래스를 만들려고합니다. 이를 위해 템플릿 매개 변수가 픽셀 값을 저장하는 방법을 정의하는 곳 (주로 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
};
는 지금, 나는 Image
에서 파생 된 다른 클래스 ColorImage
있습니다. 내가 다른 하나 개의 색 공간을 변환 할의 convert()
함수에서
// 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;
};
: 그것은 이미지의 색상 공간을 정의하는 또 다른 템플릿 인수를 추가합니다. 이를 위해 원본 이미지의 모든 데이터를 output
-Image로 복사하고 싶습니다. 그러나 output->width
등으로 전화하면 C2248 : 'Image :: width': 'Image'클래스에 선언 된 전용 멤버에 액세스 할 수 없습니다. .
다른 특수화의 다른 비공개 멤버도 액세스 할 수 없습니다. output->foo = 42
(위 참조) throws 'ColorImage'클래스에 선언 된 전용 멤버에 액세스 할 수 없습니다.. 나는 부분 전문화를 위해 모든 전문 분야를 friend
으로 선언함으로써이 문제를 해결할 수 있음을 알고 있습니다. 그 이유는 많은 개별 금액 (-declarations)을 발생시킬 수 있기 때문입니다. 공간). 나는 또한 대중에게 setFoo (int value)
과 같은 것을 선언 할 수 있다는 것을 알고 있지만 변수를 공개하지 않으려 고하기 때문에 그 일을하고 싶지 않습니다. 이것을 달성하는 다른 방법이 있습니까?
미리 감사드립니다.
이 경우 문제가되지 않습니다. 문제는 'TemplateType'이'TemplateType '과 관련이 없다는 점입니다. 단, 코드의 텍스트 모양은 다릅니다. –
아하이 봐요. 좋은 지적이야, 마크. – erapert