2009-11-27 4 views
8

J'essaie de créer un objet liste, avec la classe itérateur imbriquée à l'intérieur pour comprendre comment cela fonctionne. Dans certaines méthodes, j'essaie de renvoyer un objet itérateur mais cela ne fonctionne pas. J'ai créé un exemple pour montrer le problème:C++ retournant une classe imbriquée avec un modèle sur un problème de classe de base

// CLASS A 
template <class T> 
class A 
{ 
    public: 
     class B; 
     A(){} 
}; 

// CLASS B 
template <class T> 
class A<T>::B 
{ 
    private: 
     int varB; 

    public: 
     B(B& b); 
     B(const int&); 
     B returnThis(); 
}; 

template <class T> 
A<T>::B::B(const int& value) 
{ 
    varB = value; 
} 

template <class T> 
A<T>::B::B(B& b) 
{ 
    varB = b.varB; 
} 

template <class T> 
A<T>::B A<T>::B::returnThis() 
{ 
    return *this; 
} 

// MAIN 

void main() 
{ 
    A<int>::B classB(10); 
} 

L'erreur est à proximité de ces lignes:

template <class T> 
A<T>::B A<T>::B::returnThis() 

Le compilateur me dit que je suis un manque; avant A :: B :: returnThis()

J'essaye de résoudre ce problème pendant des jours et je ne peux pas trouver un moyen de le faire fonctionner ... J'apprécierais vraiment de l'aide. Merci d'avance!

Répondre

13

Vous devez typename:

typename A<T>::B 

Pour indiquer au compilateur que A<T>::B est un type. Voici un good explanation pourquoi.

Qu'est-ce B dépend de ce que A<T> est, cela s'appelle dépendance. Chaque fois que vous obtenez un type en dehors d'une classe ou d'une structure et qu'il dépend d'un modèle, vous devez utiliser typename.

+0

Merci beaucoup! Je vais regarder @ typename! –

+0

Pas de problème. :) – GManNickG

Questions connexes