2017-08-01 1 views
1

Je travaille actuellement avec des nœuds de type template, je rencontre un problème lorsque je compare ces nœuds avec des données d'une classe normale. Les 2 types de données qui ne correspondent pas sont la ligne root->data = item;root est Node<string> *TreeParser::root, où item est const Node <string> &. Lorsque vous regardez un travail précédent où les deux classes sont de type, cela fonctionne. Cependant, lorsque je change la classe en un type non-type, ce code ne fonctionne plus. Comment puis-je obtenir ces 2 différents types de données pour se parler sans changer de classe pour taper le modèle. Voici mon exemple de code:C++ - Comparaison des types de données entre les modèles et les classes

template <typename T> 
struct Node { 
    T data; 
    Node* lLink; 
    Node* rLink; 
}; 

class TreeParser{ 
public: 
    void insert(const Node<string>& item); 
private: 
    Node<string>* root{ nullptr }; 
}; 

void TreeParser::insert(const Node<string>& item){ 
    if (root == nullptr){ 
     root = new Node<string>(); 
     root->data = item; 
     return; 
    } 
    else 
    //do something 
} 

Répondre

2
root->data = item; 

Ce root est un pointeur vers une Node<string>

root = new Node<string>(); 

Ainsi, Pop quiz: ce qui est root->data. La bonne réponse est, bien sûr, std::string. Le paramètre de modèle est std::string, donc avec le modèle déclarant:

T data; 

Avec T étant le std::string mentionné ci-dessus, nous concluons là que dans cette déclaration:

root->data = item; 

La partie root->data est un std::string. Maintenant, le prochain point de discussion est ce qui est le item ici exactement, il est bien déclaré:

const Node<string>& item 

Ainsi donc, votre item est un Node<string>.

Donc, en résumé:

root->data = item; 

tente d'affecter un Node<String> à un string.

Cela, bien sûr, ne va pas fonctionner. La seule chose qui peut être attribuée à un std::string serait un autre std::string, ou un const char *, peut-être, ou quelques autres choses qui ne sont pas importantes ici.

Votre intention probable est:

root->data = item.data; 

Mais, en tout lieu, vous pouvez trouver une autre std::string fonctionnera aussi bien ici.

+0

Merci pour la réponse, est tellement logique quand vous le traversez de cette façon. –

1

Dans votre code root->data est un string alors item est une référence Node<string>. Ce sont évidemment des types incompatibles. Si vous voulez vraiment éviter de tordre TreeParser vous devriez utiliser le constructeur de copie ou de déplacement de Node pour la création de root. Quelque chose comme: root = new Node<string>(item);

Oh oui, et pour renoncer au commentaire habituel, utilisez unique_ptr ou shared_ptr au lieu d'un pointeur nu.