C++ قالب typename مكرر




templates iterator (3)

أولاً ، كما هو مذكور في الإجابات الأخرى ، اكتب كتابة الأسماء المتداخلة في أنواع تابعة يجب أن يتم typename أساسية typename .

لا توجد حاجة لهذه الكلمة الرئيسية عندما يكون القالب list<tnode<int>*>::iterator بالكامل ، وهذا يعني أن list<tnode<int>*>::iterator لا تحتاج إلى typename ، ولكن عندما تعتمد الطبقة الخارجية على معلمة القالب T ، يجب أن تكون typename موجودة.

template <typename T> void foo() {
  list<tnode<int>*>::iterator it1; // OK without typename
  typename list<tnode<T>*>::iterator it2; // typename necessary
}

ثانيا ، حتى مع typename الملف

typename list<tNode<T>*>::iterator it();

الإعلان سوف يعلن عن وظيفة ، وليس مكرر. إزالة () .

خذ بعين الاعتبار ملف الرأس التالي:

template <typename T> struct tNode
{
    T Data;                      //the data contained within this node
    list<tNode<T>*> SubNodes;       //a list of tNodes pointers under this tNode

    tNode(const T& theData)
    //PRE:  theData is initialized
    //POST: this->data == theData and this->SubNodes have an initial capacity
    //      equal to INIT_CAPACITY, it is set to the head of SubNodes
    {
        this->Data = theData;
        SubNodes(INIT_CAPACITY);   //INIT_CAPACITY is 10
    }

};

الآن ضع في اعتبارك سطر من التعليمات البرمجية من ملف آخر:

list<tNode<T>*>::iterator it();  //iterate through the SubNodes

المحول البرمجي يعطيني رسالة الخطأ هذه: Tree.h:38:17: error: need 'typename' before 'std::list<tNode<T>*>::iterator' because 'std::list<tNode<T>*>' is a dependent scope

ليس لدي أي فكرة عن السبب الذي يجعل المترجم يصيح لي من أجل هذا.


في list<tNode<T>*>::iterator ، يكون لديك اسم تابع ، أي اسم يعتمد على معلمة قالب.

على هذا النحو ، لا يستطيع المحول البرمجي فحص list<tNode<T>*> (لا يحتوي على تعريفه في هذه المرحلة) ولذلك لا يعرف ما إذا كانت list<tNode<T>*>::iterator هي إما حقل ثابت أو نوع.

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

typename list<tNode<T>*>::iterator it

list<tNode<T>*>::iterator هو اسم تابع ، وهو نوع يعتمد على معلمة قالب. لإعلان هذا المتغير ، يجب استخدام الكلمة الرئيسية typename :

typename list<tNode<T>*>::iterator it = ...;






typename