2015-01-26 1 views
0

템플릿을 사용하여 다른 종류의 이미지를 나타낼 수있는 클래스를 만들려고합니다. 이를 위해 템플릿 매개 변수가 픽셀 값을 저장하는 방법을 정의하는 곳 (주로 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)과 같은 것을 선언 할 수 있다는 것을 알고 있지만 변수를 공개하지 않으려 고하기 때문에 그 일을하고 싶지 않습니다. 이것을 달성하는 다른 방법이 있습니까?

미리 감사드립니다.

답변

0

하면이 회원을 보호 있어요에 액세스 할 public를 사용하여 ColorImage를 유도 해보십시오 :

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

더 C에 대한 ++ 상속 on this SO post합니다.

+1

이 경우 문제가되지 않습니다. 문제는 'TemplateType '이'TemplateType '과 관련이 없다는 점입니다. 단, 코드의 텍스트 모양은 다릅니다. –

+0

아하이 봐요. 좋은 지적이야, 마크. – erapert