Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何定义通过多个模板层派生的类型?_C++_Templates_Typedef - Fatal编程技术网

C++ 如何定义通过多个模板层派生的类型?

C++ 如何定义通过多个模板层派生的类型?,c++,templates,typedef,C++,Templates,Typedef,也许我的谷歌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_

也许我的谷歌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;

        // [...]
    };
};
模板
结构btree_节点{
公众:
typedef btree_节点此节点;
typedef boost::共享的ptr句柄;
// [...]
};
模板
B类树{
公众:
类缓存存储;
typedef btree_node_t;
typedef typename node_t::handle_t node handle_t;
// [...]
类缓存\u存储\u t{
公众:
//typedef typename btree::nodehandle\u t nodehandle\u t;//失败--为什么?
typedef typename boost::共享节点句柄;
// [...]
};
};
如您所见,我必须在
缓存存储中重新定义
节点句柄
,因为如果我尝试使用注释掉的typedef行(我更喜欢),我会得到一个错误“struct btree_node”中没有名为“handle_t”的类型,这显然是不正确的,编译器知道这一点,因为typedef在
btree
中运行良好。我还尝试了使用typename btree::nodehandle\t,以及我所能想到的关于这两者的每一个变化,都是徒劳的

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


(有一个类似的问题,但它似乎不适用,因为我试图
typedef
的东西本身并不是一个模板。我所能找到的其他东西似乎都不太接近。)

我觉得它像是一个编译器错误。可以肯定的是,我将您的代码放入
clang
并实例化了
btree::caching\u storage\u t
,在删除注释字符的情况下,所有这些都可以正常工作

它也适用于GCC4.5.1