الوصول إلى نوع المؤشر الخاص بالفئات الأساسية للقالب

StackOverflow https://stackoverflow.com/questions/861133

سؤال

لدي فصل دراسي تم تقديمه لي ولا أرغب حقًا في تغييره، لكني أرغب في تمديده.أنا مبتدئ في الأنماط والقالب وأقوم بتجربة نمط الديكور المطبق على فئة القالب.تحتوي فئة القالب على مؤشر إلى عضو (إذا فهمت الدلالات بشكل صحيح) في فئة أخرى.المؤشر إلى العضو هو أداة إلغاء تسلسل 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, ، ومع ذلك يبدو أن هذا الفصل يعمل بشكل جيد كما هو.لا توجد أي #تعريفات إضافية في ملف الرأس المقدم، لذا فإن هذا الأمر غامض بعض الشيء بالنسبة لي.

الآن أحاول توسيعه، كمصمم لأنني أريد القيام بمزيد من العمل على كائن auto_ptr الذي تم إرجاعه بواسطة MYFUN:

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& );

هذا يعمل.أفضل ألا أضطر إلى القيام بذلك لكل D/Decorator قد أقوم بإنشائه من B.لقد حاولت تنفيذ 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++ Lite لمزيد من التفاصيل حول سبب ضرورة ذلك، ولكن الملخص هو أنه بسبب إمكانية تخصص القالب، لا توجد طريقة للمترجم للتأكد من ذلك B<T>::MYFUN يشير في الواقع إلى نوع ما.

نصائح أخرى

ويتم تعريف typedef وMYFUN في B مع الرؤية الخاص. و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;
};
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top