2010-10-10 54 views
1

也許我的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事情本身不是一個模板。沒有別的我已經能夠找到,似乎還差得遠。)

回答

3

它看起來像一個編譯器bug。可以肯定的是,我把你的代碼放入clang並且實例化了btree<int>::caching_storage_t,所有工作都正常,並且註釋字符被刪除。

它也適用於GCC4.5.1 and GCC4.3.4