2016-09-19 4 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

나는 이것이 대답 일 것이라고 확신했다; 컴파일러는 거의 거짓말을하지 않습니다. 다른 한편으로는, 저기에 아주 영리한 사람들이 있습니다. 나는 지옥이 무엇인지 생각해 보았습니다. 물어 보지 않아도됩니다. "Answer is useful"을 쓸 수 있으면 좋겠지 만 최근의 등록 정보로는 허용되지 않습니다. 감사!! –

+0

@NonSequitur : 호출하려고하는 함수는 비 정적 멤버 함수이므로, noClass 의 인스턴스에 바인드되어야하는 "hidden this"매개 변수가 있습니다. 그리고 같은 템플릿의 다른 인스턴스화는 관련이 없습니다 (유형 템플릿 매개 변수가 상속으로 관련되어 있어도 C++ 템플릿은 공변수가 아닙니다). 하나의 템플릿 전문 분야가 다른 분야의 전문 분야를 상속받을 수도 있지만 좋은 해결책이라고 생각하지는 않습니다. 공유 구현을 유지하기 위해 공통 기본 클래스를 만드는 것을 고려할 수 있습니다. Curiously Recurring Template Pattern을 나타내는 CRTP –

+0

을 살펴보십시오. 이 클래스를 사용하면 기본 클래스의 공유 구현에서 파생 클래스의 멤버에 액세스 할 수 있습니다. –

관련 문제