Как определить тип, полученный из нескольких слоев шаблонов? - PullRequest
1 голос
/ 10 октября 2010

Может быть, мой Google-фу недостаточно силён.

Используя 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 (что я бы предпочел), я получу ошибку "нет имени 'handle_t' в 'struct btree_node <...>' "- что, очевидно, неверно, и компилятор знает это, так как typedef прекрасно работает в btree. Я также попробовал using typename btree::nodehandle_t;, и все варианты, которые я мог придумать для обоих, безрезультатны.

Это проблема языка / синтаксиса (и если да, каков правильный синтаксис), или это ошибка компилятора?

(здесь похожий вопрос здесь , но, похоже, он не применим, потому что то, что я пытаюсь typedef, само по себе не является шаблоном. Больше ничего я не смог найти кажется даже близко.)

1 Ответ

3 голосов
/ 10 октября 2010

Для меня это похоже на ошибку компилятора.Чтобы быть уверенным, я помещаю ваш код в clang и создаю экземпляр btree<int>::caching_storage_t, все работает нормально, даже с удаленными символами комментария.

Он также работает на GCC4.5.1 и GCC4.3.4 .

...