2010-10-10 4 views
1

Peut-être que mon Google-fu n'est pas assez fort.Comment typer un type dérivé de plusieurs couches de modèles?

En utilisant GCC 4.4.3, j'ai un ensemble de classes comme ceci:

template <typename storage_t, typename index_t = std::size_t, typename 
    leaf_payload_t = std::size_t> 
struct btree_node { 
    public: 
    typedef btree_node<storage_t, index_t, leaf_payload_t> this_t; 
    typedef boost::shared_ptr<this_t> handle_t; 

    // [...] 
}; 

template <typename storage_t, typename index_t = std::size_t, typename 
    leaf_payload_t = std::size_t> 
class btree { 
    public: 
    class caching_storage_t; 
    typedef btree_node<caching_storage_t, index_t, leaf_payload_t> node_t; 
    typedef typename node_t::handle_t nodehandle_t; 

    // [...] 

    class caching_storage_t { 
     public: 
     //typedef typename btree::nodehandle_t nodehandle_t; // Fails -- why? 
     typedef typename boost::shared_ptr<node_t> nodehandle_t; 

     // [...] 
    }; 
}; 

Comme vous pouvez le voir, j'ai dû redéfinir nodehandle_t à caching_storage_t, parce que si je l'essayer avec le ligne typedef commentée (que je préfère), j'obtiens une erreur "aucun type nommé 'handle_t' dans 'struct btree_node < ...>'" - ce qui est évidemment incorrect, et le compilateur le sait depuis le typedef fonctionne bien dans btree. J'ai également essayé un using typename btree::nodehandle_t;, et toutes les variations que j'ai pu penser à la fois, en vain.

Est-ce un problème de langue/syntaxe (et si oui, quelle est la bonne syntaxe), ou est-ce un bug du compilateur?

(Il y a une question similaire here, mais il ne semble pas appliquer parce que la chose que je suis en train de typedef n'est pas lui-même un modèle. Rien d'autre que je suis en mesure de trouver semble même proche.)

Répondre

3

Cela ressemble à un bogue du compilateur. Pour être sûr, je mets votre code dans clang et instancié btree<int>::caching_storage_t, tout fonctionne très bien aussi avec les caractères de commentaire supprimés.

Il fonctionne également sur GCC4.5.1 and GCC4.3.4.

Questions connexes