加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 模板子类指针问题

发布时间:2020-12-16 09:28:39 所属栏目:百科 来源:网络整理
导读:在疯狂的时刻,我决定写一个四叉树C模板类.我遇到了一些奇怪的编译器错误,我不了解子类和指向模板的指针.我发现了一些hacky工作,但我想知道是否有人可以解释为什么我的代码不能编译… 我在Linux上,用scons构建,使用g 我的代码看起来像这样,我有一个模板类来描
在疯狂的时刻,我决定写一个四叉树C模板类.我遇到了一些奇怪的编译器错误,我不了解子类和指向模板的指针.我发现了一些hacky工作,但我想知道是否有人可以解释为什么我的代码不能编译…

我在Linux上,用scons构建,使用g

我的代码看起来像这样,我有一个模板类来描述树和一个描述’叶子’的子类:

template <class value_type>
class QuadTree
{

public:

    class Leaf //-Subclass--------------------------
    {
        friend class QuadTree< value_type >;
    protected:
        value_type* m_data;

        Leaf();
        ~Leaf();

    }; //-end-subclass------------------------------

    QuadTree();

    ~QuadTree();

    Leaf * Insert ( const value_type & _x );

protected:

    QuadTree( Quadtree< value_type >* _parent );

    QuadTree< value_type >* m_parent;

    QuadTree< value_type >* m_children[4];

    std::set< Leaf* > m_leaves;

};

我得到的第一个指针问题是在QuadTree析构函数中:

template <class value_type>
QuadTree< value_type >::~QuadTree()
{
    // ... Delete children ...

    // I allocate each leaf,so I need to delete them
    std::set< Leaf* >::iterator it = m_leaves.begin(); // <-- bad
    std::set< Leaf* >::iterator endit = m_leaves.end(); // <-- bad
    for(;it != endit; ++it)
        delete *it;
}

当我编译时,我得到这个错误:期望’;’在’它’和预期之前’;’在’endit’之前.
另一个指针错误位于Insert函数定义中:

template <class value_type>
Leaf * QuadTree< value_type >::Insert ( const value_type & _x ) // <-- bad
{
    // Insert stuff...
}

我得到编译错误:期望构造函数,析构函数或’*’标记之前的类型转换

任何人都知道我为什么会收到这些错误?我已经解决了这些问题,但我想知道为什么我不能这样做.

PS.我编辑了代码来显示它,所以有可能我错过了一些我认为完全无关紧要的东西.

编辑.固定四叉树 – > QuadTree错字

解决方法

你需要

typename std::set< Leaf* >::iterator it = m_leaves.begin(); 
typename std::set< Leaf* >::iterator endit = m_leaves.end();

std :: set的类型取决于另一个模板参数,你必须告诉编译器这实际上是一个类型. gcc 4.5.0产生更好的错误消息.

第二个错误类似:

template <class value_type>
typename QuadTree<value_type>::Leaf* QuadTree< value_type >::Insert ( const value_type & _x )
{
    // Insert stuff...
}

Leaf是QuadTree的内部类.您需要将其命名为此类,并且您需要指定QuadTree的类型,因为内部类依赖于模板参数.

另一件事:你在很多地方都有QuadTree的拼写错误.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读