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