2015-01-26 88 views
0

我想創建一個類,可以通過使用模板來表示不同類型的圖像。爲此,我創建了一個通用的基類(不應初始化),其中模板參數定義應如何存儲像素值(主要爲floatunsigned 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),但我不想這樣做,因爲我不想將變量暴露給公衆。是否有另一種方法來實現這一點?

非常感謝。

回答

0

嘗試使用public到它的保護成員訪問獲得ColorImage

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

更多關於C++的繼承on this SO post

+1

在這種情況下,這不是問題。問題在於'TemplateType '與'TemplateType '無關,除了代碼中的文字外觀。 – 2015-01-26 19:30:06

+0

啊我明白了。好點,馬克。 – erapert 2015-01-26 19:48:59