c++ - 使用未定义类型错误定义树

标签 c++ c++11 containers

我有一个 Visual Studio 2013 C++11 项目,我在其中定义了一个树状结构(其中迭代器的每个元素本身就是一个容器)。

struct some_tree;

class some_tree_iterator 
    : public boost::iterator_facade<
        some_tree_iterator,
        some_tree,
        std::forward_iterator_tag,
        some_tree>
{
public:
    // ...

private:
    // error C2027: use of undefined type 'some_tree'
    some_tree dereference() const { return some_tree( /*init values*/ ); };

    // ...
};

struct some_tree
{
    some_tree_iterator begin();
    some_tree_iterator end();
    std::string value() const;
};

int main(int argc, char* argv[])
{
    some_tree foo;
    for (auto x : foo)
    {
        std::cout << x.name() << std::endl;
        for (auto y : x)
        {
            std::cout << "\t" << y.value() << std::endl;
        }
    }

    return 0;
}

绕过使用未定义类型 问题的唯一方法是返回指向新some_tree 容器的指针吗?像这样:

std::shared_ptr<some_tree> some_tree_iterator::dereference() const 
{ 
    return std::make_shared<some_tree>( /* init values*/ ); 
};

最佳答案

两种方法:

方法一

在定义类之前,您不得引用该类。所以你必须这样做:

struct some_tree;

class some_tree_iterator 
{
public:
    // ...

private:
    some_tree dereference() const;

    // ...
};

struct some_tree
{
    some_tree_iterator begin();
    some_tree_iterator end();
    std::string value() const;
};

some_tree some_tree_iterator::dereference() const { return some_tree( /*init values*/ ); };

STL 方法:

此外,您也可以像 STL 一样在 struct some_tree 中定义迭代器(事实上,STL 的迭代器是模板,因此它们在类中定义,即使在其他地方声明也是如此):

struct some_tree
{
  class iterator 
    : public boost::iterator_facade<
        iterator,
        some_tree,
        std::forward_iterator_tag,
        some_tree>
  {
    public:

    private:
      some_tree dereference() const { return some_tree( /*init values*/ ); };

  };

  iterator begin();
  iterator end();
  std::string value() const;
};

关于c++ - 使用未定义类型错误定义树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23142197/

相关文章:

c++ - 彩色窗口上的文字

c++ - 使用带有 Clang 的 Boost 编译 C++ 项目时出现问题

docker - $ docker run -it docker.elastic.co/elasticsearch/elasticsearch命令中的 “sh”来自哪里:7.3.1 sh

docker - 在 docker 中创建一个纯数据镜像

c++ - 模板函数指针作为模板参数

c++ - std::sort 在 C++ 中?

c++ - 删除导致段错误的 cout 语句

c++ - 使用 g++ 链接时出现错误

c++ - std::ignore 的可能实现

c++ - 从 C++ 应用程序发送验证电子邮件