2016-09-19 33 views
0

テンプレートの特殊化関数を別の関数から呼び出すことを検討しようとしています。次の短いセグメントでは、REDからBLACK固有の関数を呼び出そうとしています。私は、次のコンパイラエラー特殊化関数他の関数からの呼び出し

は完璧な理にかなっているbool noClass<color>::_open() [with Colors color = (Colors)2]’ without object

メンバ関数を呼び出すことはできません取得します。どのようにして(または私は)赤からBLACKへの電話をかけることができますか?コードセグメントはnoClass C++ヘッダの下にあります。

#ifndef COLORS_H 
#define COLORS_H 

enum class Colors { RED, GREEN, BLACK }; 

#endif /* COLORS_H */ 

#ifndef NOCLASS_H 
#define NOCLASS_H 


    template <Colors color> 
    class noClass { 
     public: bool Open (); 
     protected: bool _open (); 
    }; 

    template <Colors color> bool noClass<color>::Open () { return noClass<color>::_open (); } 

    template <Colors color> bool noClass<color>::_open () { return true; } 

    template <> inline bool noClass<Colors::BLACK>::_open () { return true; } 

    template <> inline bool noClass<Colors::RED>::_open () { return noClass<Colors::BLACK>::_open(); } 

#endif /* NOCLASS_H */ 

答えて

0

必要なタイプのインスタンスがないため、できません。ヘルパー関数に共通コードを記述して、両方のスペシャライゼーションがそれを呼び出すようにしてください。

+0

私はこれが答えになると確信していました。コンパイラはほとんど存在しません。一方、そこには非常に巧みな人がいて、私は地獄のことを考え出しました。私は "答えは有用です"ことができれば幸いですが、最近の登録簿として私は許可されていません。ありがとう!! –

+0

@NonSequitur:あなたが呼び出そうとしている関数は非スタティックなメンバ関数なので、 'noClass 'のインスタンスにバインドされなければならない "hidden this"パラメータがあります。また、同じテンプレートの異なるインスタンス化は関連しません(型テンプレートパラメータが継承によって関連していても、C++テンプレートは共変しません)。 1つのテンプレートの特殊化を別のものから継承することは可能ですが、ここでは良い解決策のように感じません。共通の実装を保持する共通の基本クラスを作成することを検討することもできます。 Curiously Recurring Template Patternの略であるCRTP –

+0

を見てください。これは、基底クラスの共有実装が派生クラスのメンバーにアクセスできるようにします。 –

関連する問題