Может быть, мой 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
, само по себе не является шаблоном. Больше ничего я не смог найти кажется даже близко.)