2010-11-17 6 views
0

J'utilise la bibliothèque de graphes Boost et j'ai créé mes propres classes.Obtenir/déduire type dans la fonction de modèle pour la valeur de retour

Maintenant, j'ai la fonction suivante:

template< class VERTEXPROPERTIES > 
VERTEXPROPERTIES& properties(const Vertex& v) const 
{ 
    typename property_map<FilteredGraphContainer, vertex_properties_t>::const_type param = get(vertex_properties, graph_); 

    return param[v]; 
} 

Lorsque j'utilise cette fonction dans un modèle de classe comme ceci:

template< class VERTEXPROPERTIES, class EDGEPROPERTIES > 
class Graph 
{ 
// all the code 
}; 

cela fonctionne. Cependant, quand je veux l'utiliser dans une classe comme ceci:

template < class GRAPH, class EDGE_PREDICATE, class VERTEX_PREDICATE > 
class FilteredGraph 
{ 
// all the code 
}; 

et appliquer la fonction des propriétés() à un objet FilteredGraph, le compilateur se plaint qu'il ne peut pas trouver la fonction.
Pour autant que je l'ai découvert jusqu'à présent, cela est probablement dû au paramètre de modèle manquant dans la liste des arguments.
Pour la classe Graph, ce paramètre de modèle est facile à trouver, car il est défini lors de la création d'un objet graphique.
Mais pour le FilteredGraph, il devrait être capable de le déduire du paramètre GRAPH-template.
Puis encore, je pense que le compilateur aura quand même des problèmes pour obtenir le bon type de valeur de retour car cela pourrait probablement être nécessaire pour le savoir ...
Je voudrais vraiment garder ce concept avec la fonction properties() car cela permet de garder les autres fonctions génériques.
Avez-vous des idées pour résoudre ce problème, en conservant peut-être le concept?

+1

Veuillez publier l'erreur de compilation et les définitions des classes. Vous nous avez donné des informations ** Non **. –

+0

Mes excuses pour cela. Je n'ai pas posté cela ici, car je pensais que cela ne ferait qu'encombrer la question. L'erreur du compilateur était simplement qu'il ne pouvait pas trouver la fonction qui était utilisée dans mon code.J'ai été capable de le fixer à la fonctionnalité property_traits fournie par la bibliothèque boost. Je posterai la réponse séparément. – Shadow

+0

Non, ne vous inquiétez pas. Je n'encombrerais pas la réponse. Les erreurs de compilation sont en général extrêmement utiles. Parfois un peu énigmatique, mais plus que très souvent, extrêmement précis. –

Répondre

0

Encore une fois, mes excuses pour ne pas fournir plus d'informations.
Il m'a semblé que le compilateur n'était pas capable d'en déduire le type dépendant. J'ai rencontré ce problème quelques fois avant de travailler avec des modèles.
Je vais fournir le correctif ici au cas où quelqu'un pourrait rencontrer des problèmes similaires. Le FilteredGraph utilise une instance de Graph (essentiellement une liste adjacency avec des propriétés personnalisées internes) en tant qu'entrée. La classe Graph a deux paramètres de modèle, un pour les propriétés des sommets et un pour les propriétés des arêtes.
En utilisant des propriétés groupées (non supportées par une ancienne version de la bibliothèque de graphes boost et pas par certains compilateurs), je pense que ce problème pourrait être contourné car vous n'aurez pas besoin d'une fonction supplémentaire retournant une valeur de (éventuellement) type inconnu. Étant donné que l'objet graphique transmis au FilteredGraph doit être spécifié pour certains types particuliers de propriétés vertex/edge, cette information peut réellement être extraite.
J'atteint ce via:

/// Type of the internal properties of the edges 
typedef typename property_traits< typename property_map<FilteredGraphContainer, vertex_properties_t>::type >::value_type VProps; 
/// Type of the internal properties of the edges 
typedef typename property_traits< typename property_map<FilteredGraphContainer, edge_properties_t>::type >::value_type EProps; 

puis définir:

VProps& properties(const Vertex& v) 
{ 
     typename property_map<FilteredGraphContainer, vertex_properties_t>::type param = get(vertex_properties, graph_); 
     return (param[v]); 
} 

Merci encore pour votre intérêt pour cette question et je suis désolé de ne pas avoir fourni plus d'informations.

Cordialement.

+0

Vous pouvez accepter vos réponses (y compris les vôtres) en utilisant la coche à gauche de la question. Cela marque la réponse à la question et permet à d'autres personnes ayant le même problème de trouver la solution plus facilement. –

+0

Je pense que vous devriez utiliser plus typedef. Vos lignes de codes sont longues. –

+0

En ce qui concerne le "accepter vos réponses", il est dit que je ne peux que marquer comme résolu en deux jours. Merci pour l'indice. – Shadow

Questions connexes