也許我的Google-fu功能不夠強大。如何typedef通過幾層模板派生的類型?
使用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;
// [...]
};
};
正如你所看到的,我已經在caching_storage_t
重新定義nodehandle_t
,因爲如果我與嘗試註釋掉typedef行(我更喜歡),我得到一個錯誤「結構btree_node < ...」中沒有類型命名'handle_t' - 這顯然是不正確的,編譯器知道它,因爲typedef在btree
中正常工作。我也嘗試了一個using typename btree::nodehandle_t;
,以及我在兩個方面都能想到的每一個變體,都無濟於事。
這是一個語言/語法問題(如果是的話,什麼是正確的語法),還是它是一個編譯器錯誤?
(有一個類似的問題here,但它似乎並不適用,因爲我想typedef
事情本身不是一個模板。沒有別的我已經能夠找到,似乎還差得遠。)