2016-09-19 80 views
0

我想弄清楚從另一個函數調用模板特化函數。在下面的短片段中,我試圖從RED中調用BLACK特定函數。我得到以下編譯器錯誤專業化函數從其他函數調用

無法調用成員函數bool noClass<color>::_open() [with Colors color = (Colors)2]’ without object

這是非常合情合理的。如何(或可以)通過RED工作撥打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:你試圖調用的函數是一個非靜態成員函數,因此它有一個「hidden this」參數,它必須綁定到'noClass '的實例。同一模板的不同實例不相關(即使它們的類型模板參數通過繼承關聯 - C++模板不是協變的)。可能有一個模板專門化從另一個模板繼承,但是這並不是一個好的解決方案。您可能會考慮製作一個通用基類來保存共享實現。看看CRTP –

+0

,它代表奇怪的循環模板模式。它允許基類中的共享實現訪問派生類的成員。 –