لماذا لا يمكنني إعلان صديق من خلال typedef؟

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

  •  23-08-2019
  •  | 
  •  

سؤال

هل يعرف أحد لماذا لا تعمل TypeDef من أسماء الفئة مثل أسماء فئة لإعلان الأصدقاء؟

class A
{
public:
};

class B : public A
{
public:
   typedef A SUPERCLASS;
};

typedef A X;

class C
{
public:
   friend class A;             // OK
   friend class X;             // fails
   friend class B::SUPERCLASS; // fails
};
هل كانت مفيدة؟

المحلول

لا يمكن، حاليا. أنا لا أعرف السبب بعد (مجرد البحث عنه، لأنني أجد أنه مثير للاهتمام). تحديث: يمكنك العثور على السبب في الاقتراح الأول لدعم أسماء Typedef كأصدقاء: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1520.pdf. وبعد والسبب هو أن المعيار يدعم فقط محطات المواصفات المطلية. من السهل السماح فقط بالذين، ويقولون ما إذا كان الكيان الذي أعلن أنه صديق لم يتم الإعلان عنه بعد، سيتم إجراء عضو في مساحة الاسم المحيطة. ولكن هذا يعني أنه إذا كنت ترغب في استخدام معلمة القالب، فسيتعين عليك القيام به (مطلوب فئة ثم على سبيل المثال)

friend class T;

لكن ذلك جلب مشاكل إضافية، وتم احتساما لا يستحق الربح. الآن، تقترح الورقة السماح بمنح تحديد أنواع إضافية (حتى يسمح بذلك بعد ذلك باستخدام معلمات القالب وأسماء Typedef).

ستتمكن النسخة C ++ التالية (بسبب 2010) من القيام بذلك.

انظر هذا الاقتراح المحدث إلى المعيار: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf. وبعد لن يسمح بأسماء Typedef فقط، ولكن أيضا معلمات القالب لاستخدامها كحالة معلنة كصديق.

نصائح أخرى

AFAIK، في C ++ Typedef لا يقوم بإنشاء مرادفات كاملة عند استخدامها في امتداد مع الفصول. وبعبارة أخرى، ليس مثل ماكرو.

من بين القيود المفروضة على أنه لا يمكن أن يظهر المرادف بعد بادئة فئة أو بادئة، أو يتم استخدامها كاسم مدمر أو اسم المنشئ. لا يمكنك أيضا تصنيف المرادف. أراهن أن هذا يعني أيضا أنه لا يمكنك صديقه.

حاولت في VC ++ 8.0 الرمز:

...
class C
{
public:
  friend class A;       
  friend X;             
  friend B::SUPERCLASS; 
};
...

يتم تجميعها دون أخطاء.

أنا لست على علم بما إذا كان MS خاصا أم لا.

يحدد TypeDef نوعا. يعلن الصديق أن تعلن دروس الأصدقاء أو الوظائف (نطاقات كبيرة)، والتي لديها بعد ذلك "الوصول" إلى المنطقة غير العامة من الطبقة الإعلانية ...

الأعمليين، أي تعويم أو int * لا تحدد النطاق برمز وما إلى ذلك، فلا "يستخدمون" الفصل على أي حال.

لا تنس، يمكنك أيضا "حزمة" Call Call، Attribs المحاذاة وغيرها من الأشياء المترجم المحددة في TYPEDEF، أي أنواع ناقلات متعددة تنفذة من نفس الفئة ولكن مع Attribs محاذاة متميزة. => نوع ليس فئة، ولكن العكس صحيح.

IMHO، أعلن صديق Typedef يمكن أن يكون مفيدا، ولكن عند تعيين "TypeFFS" من أي مكان كصديق، يمكن أن تصبح الصداقات غير مفهومة للغاية وبالتالي عرضة للخطأ، خاصة حيث يتم استخدام القوالب بشكل مفرط.

إبطال typedef واحد يمكن أن يفوض المشروع بأكمله بسبب التبعيات واسعة النطاق. يعتبر Template Friends و Typrefs Typedfs 0x مفيدة، ولكن لا ترخي قواعد إعلان الصديق.

لا أعرف أي اقتراح يتعلق بصديق Typedefs.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top