2017-04-02 1 views
0
  1. Je suis en train de construire une union qui remplacera la paire de pointeurs (gauche & droite) par un syndicat qui est accessible un tableau. A l'origine c'est le code de travail pour une recherche binaire Arbre (BST)

Je veux être en mesure de le faire:Comment coder une union en utilisant un struct comme modèle, tout en ayant cette union comme un élément

p = p->pLR.array[value>insertValue]; 

en plus de l'ancien ramifié

if(value>insertValue) p = p->right; 
else p = p->left; 

1b . Ce n'est pas exactement pour éviter une erreur de branchement coûteux, mais simplement pour pouvoir apprendre pour implémenter [quelque chose] comme ceci.

  1. Principalement le problème que BinaryNode est modélisé dans l'union, et l'union est un élément du BinaryNode!

Voici mon code en cours non-compilation:

template <class dataType, class BinaryNode<dataType> > 
union BinaryNodePointerPair { 
struct { 
     BinaryNode<dataType> *left; 
     BinaryNode<dataType> *right; 
    }; 
    BinaryNode<dataType> *array[2]; 
}; 
template <class dataType> 
struct BinaryNode { 
    dataType value; 
    BinaryNodePointerPair<dataType,BinaryNode<dataType> > pLR; 
}; 
[Error] 'BinaryNode' is not a template 

refondus de:

template <class dataType> 
struct BinaryNode { 
    dataType value; 
    BinaryNode *left; 
    BinaryNode *right; 
}; 
  1. Ce que j'ai essayé jusqu'à présent :

3a. Selon 'X is not a template' error le modèle doit être

template <class dataType, class <dataType>BinaryNode > 
[Error] expected identifier before '<' token 
[Error] expected '>' before '<' token 
[Error] type/value mismatch at argument 2 in template parameter list for 'template<class dataType, int <anonymous> > union BinaryNodePointerPair' 

3b. Donc, je le change en

template <class dataType, class BinaryNode<dataType> > 

Mais cela donne les erreurs, plus l'original.

[Error] 'BinaryNode' is not a class template 
[Error] 'class BinaryNode' is not a valid type for a template non-type parameter 
[Error] 'BinaryNode' is not a template 

3c. Donc, je change de nouveau à

template <class dataType, class BinaryNode<dataType> > 

mais cela donne encore plus d'erreurs

[Error] 'BinaryNode' is not a class template 
[Error] 'class BinaryNode' is not a valid type for a template non-type parameter 
[Error] 'BinaryNode' is not a template 
[Error] 'BinaryNode' is not a template type 

3d. Maintenant, cela est étrangement proche de CRTP (pas besoin de me dire ce isnt vrai CRTP, mais il est curieusement)

template <class dataType> 
union BinaryNodePointerPair { 
struct { 
    BinaryNode<dataType> *left; 
    BinaryNode<dataType> *right; 
}; 
BinaryNode<dataType> *array[2]; 
}; 
template <class dataType, BinaryNodePointerPair<dataType> > 
struct BinaryNode { 
    dataType value; 
    BinaryNodePointerPair<dataType> pLR; 
}; 
[Error] 'BinaryNode' is not a template 

Seulement 1 erreur! HOU LA LA! Cela doit être un gagnant!

3e. Maintenant, je le force vraiment dans le CRTP ... c'est encore pire.

template <class dataType, class BinaryNode<dataType> > 
union BinaryNodePointerPair { 
    struct { 
     BinaryNode<dataType> *left; 
     BinaryNode<dataType> *right; 
    }; 
    BinaryNode<dataType> *array[2]; 
}; 
template <class dataType> 
struct BinaryNode { 
    dataType value; 
    BinaryNodePointerPair<dataType, BinaryNode<dataType>> pLR; 
}; 
[Error] 'BinaryNode' is not a class template 
[Error] 'class BinaryNode' is not a valid type for a template non-type parameter 
[Error] 'BinaryNode' is not a template 

Il ne doit pas nécessairement être CRTP. Y a-t-il un moyen de le faire? Comment écrire une union w/pointeurs à une structure ayant un élément de cette union?

+0

à la ruée downvoter: pourrais-je savoir quel est le problème avec la question? Quel principe de "comment poser une bonne question" ai-je violé? Comment devrais-je modifier la question pour l'améliorer? – Karl

+0

J'ai downvoted, puisque j'ai fait quelques modifications qui sont considérées comme bonnes ici (réduction du chat et des méta-commentaires) et vous les avez écrasées lors d'une édition ultérieure. (En général, je ne recommande pas de demander pourquoi les gens ont été rabaissés, car vous obtiendrez rarement une réponse - la plupart des gens voteront et passeront à autre chose). – halfer

+1

Avez-vous réellement observé un problème de performance avec seulement la structure? http://softwareengineering.stackexchange.com/questions/75390/why-should-i-care-about-micro-performance-and-efficency – Caleth

Répondre

2

Je ne comprends pas vraiment la question, mais avez-vous peut-être oublié la déclaration avant de BinaryNode?

template <class dataType> 
struct BinaryNode; 

template <class dataType> 
union BinaryNodePointerPair 
{ 
    struct 
    { 
    BinaryNode<dataType> *left; 
    BinaryNode<dataType> *right; 
    }; 
    BinaryNode<dataType> *array[2]; 
}; 

template <class dataType> 
struct BinaryNode 
{ 
    dataType value; 
    BinaryNodePointerPair<dataType> pLR; 
}; 
+0

Cela fonctionne réellement! J'aurais presque honte de moi si je n'étais pas si extatique! Comment marquer ceci comme la réponse? – Karl