كيف يمكنني قدما تعلن الداخلية الفصل ؟ [مكررة]

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

  •  06-07-2019
  •  | 
  •  

سؤال

ممكن مكررة:
إلى الأمام إعلان متداخلة أنواع/دروس في C++

لدي الدرجة مثل ذلك...

class Container {
public:
    class Iterator {
        ...
    };

    ...
};

في مكان آخر, أريد أن تمرير الحاويات::مكرر من قبل المرجعية, ولكن لا ترغب في تضمين ملف الرأس.إذا كنت في محاولة إلى الأمام تعلن الصف ، أحصل على أخطاء الترجمة.

class Container::Iterator;

class Foo {
    void Read(Container::Iterator& it);
};

تجميع التعليمات البرمجية أعلاه يعطي...

test.h:3: error: ‘Iterator’ in class ‘Container’ does not name a type
test.h:5: error: variable or field ‘Foo’ declared void
test.h:5: error: incomplete type ‘Container’ used in nested name specifier
test.h:5: error: ‘it’ was not declared in this scope

كيف يمكنني قدما تعلن هذه الفئة لذا لا يجب أن يتضمن الملف رأس يعلن مكرر الصف ؟

هل كانت مفيدة؟

المحلول

هذا هو ببساطة غير ممكن.لا يمكن إعادة توجيه تعلن بنية متداخلة خارج الحاوية.يمكنك فقط إلى الأمام يعلن أنه داخل الحاوية.

سوف تحتاج إلى القيام بأحد الإجراءات التالية

  • جعل فئة غير متداخلة
  • تغيير إعدادات إعلان النظام بحيث فئة متداخلة تماما تعريفها أولا
  • إنشاء قاعدة مشتركة الدرجة التي يمكن أن تكون تستخدم في وظيفة وتنفيذها من قبل فئة متداخلة.

نصائح أخرى

أنا لا أصدق إلى الأمام معلنا الطبقة الداخلية من على غير مكتملة فئة الأعمال (لأنه بدون تعريف الفئة ، هناك أي وسيلة لمعرفة ما إذا كان هناك فعلا هو وهي الطبقة الداخلية).لذا يجب أن تشمل تعريف الحاوية مع الأمام أعلن الطبقة الداخلية:

class Container {
public:
    class Iterator;
};

ثم في رأس منفصل وتنفيذ الحاوية::التكرار:

class Container::Iterator {
};

ثم #تشمل فقط الحاوية رأس (أو تقلق بشأن قدما معلنا و تشمل كلا)

أنا لا أعرف أي طريقة للقيام بالضبط ما تريد ، ولكن هنا هو الحل ، إذا كنت على استعداد لاستخدام قوالب:

// Foo.h  
struct Foo
{
   export template<class T> void Read(T it);
};

// Foo.cpp
#include "Foo.h"
#include "Container.h"
/*
struct Container
{
    struct Inner { };
};
*/
export template<> 
  void Foo::Read<Container::Inner>(Container::Inner& it)
{

}

#include "Foo.h"
int main()
{
  Foo f;
  Container::Inner i;
  f.Read(i);  // ok
  f.Read(3);  // error
}

ونأمل أن هذا المصطلح قد تكون ذات فائدة لك (ونأمل أن المترجم الخاص بك هو EDG-بناء وتنفيذ التصدير؛) ).

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