1

Colorクラスを特化しようとしていて、ある色空間から別の色空間に変換するためにメンバー関数to()があります。これまで私が持っているものは次のとおりです。クラスとメンバ関数のテンプレートのスペシャリゼーションが間違っていた

enum ColorSpace { 
    BGR, RGB, LAB, HSV, XYZ, YUV, HSL, CMY, YIQ, LUV, HLAB, LCH, OHTA 
}; 

template<ColorSpace _CS, typename _Dtp> class Color; 

template<typename _Dtp> 
class Color<RGB, _Dtp> { 

public: 

    Color(_Dtp R, _Dtp G, _Dtp B) : R(R), G(G), B(B) { ;; }; 
    Color() : Color(0, 0, 0) { ;; }; 
    ~Color() { ;; }; 

    _Dtp R, G, B; 

    template<ColorSpace _CS, typename _Dtp2 = _Dtp> 
    Color<_CS, _Dtp2> to<>(); 

    template<typename _Dtp2 = _Dtp> 
    Color<HSV, _Dtp2> to<HSV, _Dtp2>() { 
     Color<HSV, _Dtp2> res; 

     rgb2hsv(R, G, B, res.H, res.S, res.V); 

     return res; 
    } 

}; 

template<typename _Dtp = double> 
class Color<HSV, _Dtp> { 

public: 

    Color(_Dtp H, _Dtp S, _Dtp V) : H(H), S(S), V(V) { ;; }; 
    Color() : Color(0, 0, 0) { ;; }; 
    ~Color() { ;; }; 

    _Dtp H, S, V; 

    template<ColorSpace _CS, typename _Dtp2 = _Dtp> 
    Color<_CS, _Dtp2> to<>(); 

    template<typename _Dtp2 = _Dtp> 
    Color<RGB, _Dtp2> to<RGB, _Dtp2>() { 
     Color<RGB, _Dtp2> res; 

     hsv2rgb(H, S, V, res.R, res.G, res.B); 

     return res; 
    } 

}; 

各色空間にはそれぞれ1つのクラスがあります。各クラスには、可能なすべての変換に特化した関数to()があります。しかし、私は明白な理由のためにそれらの2つだけを掲示しています。私は、変換関数を使用しようとするので、:

Color<RGB, double> c(255, 255, 125); 

Color<HSV, double> c2 = c.to<HSV, double>(); 

を私は次のエラーを取得する:私はクラスColorのデフォルトのタイプを使用しようとすると

Error: class "Color" has no member "to"

私の最後の問題が来る:

template<typename _Dtp = double> 
class Color<RGB, _Dtp> { 
... 
... 

その場合、私もこれを書くことができません。

Color<RGB> c; 

それは私に、このエラーを与える:

Error: expected a declaration

+0

[ OT]: '_CS'と' _Dtp'は予約名です(_の後に大文字が続きます)。 – Jarod42

答えて

0

変換のためのコンストラクタを追加する方が簡単かもしれません:

enum ColorSpace { 
    BGR, RGB, LAB, HSV, XYZ, YUV, HSL, CMY, YIQ, LUV, HLAB, LCH, OHTA 
}; 

template <ColorSpace, typename = double> class Color; 

template <typename T> 
class Color<RGB, T> { 
public: 

    Color(T R, T G, T B) : R(R), G(G), B(B) {} 
    Color() : Color(0, 0, 0) {} 
    Color(const Color&rhs) = default; 
    ~Color() = default; 

    T R, G, B; 

    template <typename T2> 
    /*explicit*/ Color(const Color<HSV, T2>& rhs) 
    { 
     hsv2rgb(rhs.H, rhs.S, rhs.V, R, G, B); 
    } 
}; 
template <typename T> 
class Color<HSV, T> { 
public: 
    Color(T H, T S, T V) : H(H), S(S), V(V) {} 
    Color() : Color(0, 0, 0) {} 
    Color(const Color&rhs) = default; 
    ~Color() = default; 

    T H, S, V; 

    template <typename T2> 
    /*explicit*/ Color(const Color<RGB, T2>& rhs) 
    { 
     rgb2hsv(rhs.R, rhs.G, rhs.B, H, S, V); 
    } 

}; 

可能用法:

Color<RGB, double> c(255, 255, 125); 

Color<HSV, double> c2{c}; 
1

あなたのコードべき次のようになります。

enum ColorSpace { 
    BGR, RGB, LAB, HSV, XYZ, YUV, HSL, CMY, YIQ, LUV, HLAB, LCH, OHTA 
}; 

template<ColorSpace _CS, typename _Dtp> class Color; 

template<typename _Dtp> 
class Color<RGB, _Dtp> { 

public: 

    Color(_Dtp R, _Dtp G, _Dtp B) : R(R), G(G), B(B) { ;; }; 
    Color() : Color(0, 0, 0) { ;; }; 
    ~Color() { ;; }; 

    _Dtp R, G, B; 


    template<ColorSpace _CSO, typename _Dtp2> struct STo; 
    template<typename _Dtp2> struct STo<HSV, _Dtp2> 
    { 
     Color<HSV, _Dtp2> to() 
     { 
      Color<HSV, _Dtp2> res; 

      rgb2hsv(R, G, B, res.H, res.S, res.V); 

      return res; 
     } 
    }; 

    template<ColorSpace _CSO, typename _Dtp2> 
    Color<_CSO, _Dtp2> to() 
    { 
     STo<_CSO, _Dtp2> object; 
     return object.to(); 
    } 

}; 

template<typename _Dtp> 
class Color<HSV, _Dtp> { 

public: 

    Color(_DtpH, _DtpS, _DtpV) : H(H), S(S), V(V) { ;; }; 
    Color() : Color(0, 0, 0) { ;; }; 
    ~Color() { ;; }; 

    _DtpH, S, V; 

    template<ColorSpace _CSO, typename _Dtp2> struct STo; 
    template<typename _Dtp2> struct STo<RGB, _Dtp2> 
    { 
     Color<RGB, _Dtp2> to() 
     { 
      Color<RGB, _Dtp2> res; 

      hsv2rgb(H, S, V, res.R, res.G, res.B); 

      return res; 
     } 
    }; 

    template<ColorSpace _CSO, typename _Dtp2> 
    Color<_CSO, _Dtp2> to() 
    { 
     STo<_CSO, _Dtp2> object; 
     return object.to(); 
    } 
}; 

あなただけ定義せずに、機能特化を書き込むことはできません。そのため、「to」機能から角括弧<を削除する必要があります。しかし、この場合、別の問題があります。関数の部分的な特殊化は使用できませんが、クラスのためにはできません。この場合には、私は可能な構造体専門のエントリのような機能「SToと」「に」使用

+0

あなたはこれを意味します: 'template 色<_CS, _Dtp2>を<>();'削除しても同じエラーが発生します。 – DimChtz

+0

オハイオ州あなたは、文字通り '<>'だけを意味するのを見ています。さて、その場合、私は新しいエラーが発生します: '明示的なテンプレート引数の不正使用' – DimChtz

+0

はい。問題は、その機能を部分的に特化することはできません – arturx64

関連する問題