如何输入通过几层模板派生的类型?

时间:2010-10-10 15:28:29

标签: c++ templates typedef

也许我的Google-fu还不够强大。

使用GCC 4.4.3,我有一组这样的类:

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;

        // [...]
    };
};

正如您所看到的,我必须在nodehandle_t中重新定义caching_storage_t,因为如果我使用注释掉的typedef行(我更喜欢)尝试它,我会收到错误“'struct btree_node&lt; ...&gt;'中没有名为'handle_t'的类型 - 这显然是不正确的,并且编译器知道它,因为typedef在btree中工作正常。我也试过了using typename btree::nodehandle_t;,而且我在两者上都能想到的每一个变化都无济于事。

这是一个语言/语法问题(如果是这样,什么是正确的语法),还是编译器错误?

(有一个类似的问题here,但它似乎不适用,因为我正在尝试typedef的东西本身并不是一个模板。没有别的我能够发现似乎更接近。)

1 个答案:

答案 0 :(得分:3)

对我来说,它看起来像编译器错误。可以肯定的是,我将您的代码放入clang并实例化btree<int>::caching_storage_t,所有工作正常,删除了注释字符。

它也适用于GCC4.5.1 and GCC4.3.4