템플릿베이스 클래스 액세스 기능 기능 포인터 유형
-
21-08-2019 - |
문제
나는 정말로 변화하고 싶지 않다는 수업이 있었지만 확장하고 싶다. 나는 템플릿 클래스에 적용되는 데코레이터 패턴으로 실험하는 패턴과 템플릿 초보자입니다. 템플릿 클래스에는 또 다른 클래스에서 포인터 투 인원 (의미론을 올바르게 이해하는 경우)이 포함되어 있습니다. 포인터 투 인원은 XML Istream의 사형화제입니다. 't'유형은 사막화 할 XML 문서의 유형입니다.
template <typename T> class B {
public:
typedef std::auto_ptr<T> MYFUN(
std::istream&, const std::string&, const std::string& );
public:
B<T>( MYFUN* p );
private:
MYFUN *fptr;
std::string aString1;
std::string aString2;
};
Typedef는 읽은 후 나에게 이상하게 보입니다 http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.5, 그러나이 수업은 잘 작동하는 것 같습니다. 제공된 헤더 파일에는 추가 #Defines가 없으므로 이것은 나에게 약간 신비합니다.
이제 나는 MyFun에 의해 반환 된 Auto_PTR 객체에 대해 조금 더 많은 작업을하고 싶기 때문에 데코레이터로 확장하려고합니다.
template <typename T>
class D : public class B<T>
{
D( B<T>::MYFUN *fPtr, B<T> *providedBase ); //compiler complaint
//Looks like B
private:
B* base_;
};
template <typename T>
D<T>::D( B<T>::MYFUN *p, B<T> *base ) //compiler complaint
:
B<T>::B( p ), base_(providedBase)
{ }
이것을 컴파일하려고 할 때, 나는 표시된 두 줄에서 구문 불만을 얻습니다. 오류는 "예상")와 같은 것입니다. MyFun이 정의되지 않은 것에 대한 불만은 없습니다.
D에서와 동일한 서명으로 D의 포인터 투 인원을 다시 정의 할 때, 즉
//change MYFUN to NEWFUN in D)
typedef std::auto_ptr<T> MYNEWFUN(
std::istream&, const std::string&, const std::string& );
이것은 작동합니다. 나는 B로 만들 수있는 모든 d/데코레이터에 대해 이것을 할 필요가 없다는 것을 선호하지 않습니다. 나는 전 세계적으로 typedef를 더 많이 수행하려고했지만 템플릿 매개 변수가 정의되지 않아 구문을 올바르게 얻을 수 없었습니다.
해결책
컴파일 오류는 컴파일러가 유형에 대해 이야기하고 있다고 말할 수 없기 때문입니다.
노력하다:
D( typename B<T>::MYFUN *fPtr, B<T> *providedBase );
그리고
template <typename T>
D<T>::D( typename B<T>::MYFUN *p, B<T> *base )
보다: C ++ FAQ 라이트의 템플릿 섹션 이것이 필요한 이유에 대한 자세한 내용은 템플릿 전문화의 가능성으로 인해 컴파일러가이를 확인할 수있는 방법이 없다는 것입니다. B<T>::MYFUN
실제로 유형을 참조하고 있습니다.
다른 팁
B의 MyFun typedef의 정의는 개인 가시성으로 수행됩니다. D는 액세스 할 수 없습니다. 보호 또는 공개로 변경하면 작동합니까?
template <typename T> class B {
protected:
typedef std::auto_ptr<T> MYFUN(
std::istream&, const std::string&, const std::string& );
...
};
내가 이것으로 보는 문제는 b :: myfun이 사적인 typedef.
따라서 상속 클래스는 액세스 할 수 없습니다.
이것을 다음으로 변경하십시오.
template <typename T> class B
{
public:
typedef std::auto_ptr<T> MYFUN( std::istream&, const std::string&, const std::string& );
public:
B<T>( MYFUN* p );
private:
MYFUN *fptr;
std::string aString1;
std::string aString2;
};