2

次の(C++)コードを検討してください

class A {...};

namespace std
{
    template<>
    struct hash<A>
    {
        size_t operator() (const A& a) const
        {
            // returns unique hash based on components of A
        };
    };
}

class B
{
    std::unordered_map<A, B> *children; //ignore the fact that its a pointer for now
};

コンパイルすると、コンパイラは std::pair<_T1, _T2>::second の型が (他のエラーの中でも) 不完全であることを教えてくれます。正しく行う必要があります。

4

1 に答える 1

4

標準ライブラリは一般に、不完全な型をサポートしていない (する必要がある) と思います。

私が覚えているように、Boost Container ライブラリは明示的にこれをサポートしています。

不完全な型のコンテナ

標準コンテナはどうですか?Matt Austern の素晴らしい記事 ( The Standard Librarian: Containers of Incomplete Types )で説明されているように、不完全な型のコンテナーは長い間議論されてきました。

「私のコラムのほとんどとは異なり、これは C++ 標準ライブラリではできないこと、つまり不完全な型を標準コンテナーの 1 つに入れることについてです。このコラムでは、なぜこれを行う必要があるのか​​、なぜ標準化委員会はそれが有用であることを知っていたにもかかわらずそれを禁止したのか、そして制限を回避するために何ができるのかを説明します。」</p>

Boost.Container によって提供されるすべてのコンテナーを使用して、再帰コンテナーを定義できます。

Coliruでライブを見る

#include <boost/container/vector.hpp>
#include <boost/container/list.hpp>
#include <boost/container/map.hpp>
#include <boost/container/stable_vector.hpp>
#include <boost/container/string.hpp>

using namespace boost::container;

struct data
{
   int               i_; 
   vector<data>      v_; //A vector holding still undefined class 'data'
   list<data>        l_; //A list holding still undefined 'data'
   map<data, data>   m_; //A map holding still undefined 'data'

   friend bool operator <(const data &l, const data &r)
   { return l.i_ < r.i_; }
};

struct tree_node
{
   string name;
   string value;

   //children nodes of this node
   list<tree_node>        children_;
};

int main()
{
   //a container holding a recursive data type
   stable_vector<data> sv;
   sv.resize(100);

   //Let's build a tree based in
   //a recursive data type
   tree_node root;
   root.name  = "root";
   root.value = "root_value";
   root.children_.resize(7);
   return 0;
}
于 2013-09-20T00:16:27.570 に答える