【问题标题】:Error for typedef in header file using std::pair class使用 std::pair 类的头文件中的 typedef 错误
【发布时间】:2013-01-09 17:08:25
【问题描述】:

我正在以类似 STD 的方式编写 SkipList 实现:使用分配器、迭代器等。整个类已完成并且正在工作,但现在我正在尝试为我创建的类编写头文件。我当前的头文件内容是:

template<class _MySkiplist>
    class _Skiplist_const_iterator;

template<class _MySkiplist>
    class _Skiplist_iterator;

template<class _Kty,
    class _Pr,
    class _Alloc>
        class skiplist
        {
            typedef skiplist<_Kty, _Pr, _Alloc> _Myt;

            typedef typename _Skiplist_const_iterator<_Myt> const_iterator;
            typedef typename _Skiplist_iterator<_Myt> iterator;

            typedef typename _Alloc::size_type size_type;

            typedef std::pair<iterator, iterator> _Pairii;
            typedef std::pair<iterator, bool> _Pairib;

            skiplist();
            skiplist(const _Alloc& _Al);
            skiplist(const _Pr& _Pred);
            skiplist(const _Pr& _Pred, const _Alloc& _Al);
            ~skiplist();

            iterator begin();
            const_iterator begin() const;
            iterator end();
            const_iterator end() const;

            size_type size() const;
            size_type max_size() const;
            bool empty() const;

        //  _Pairib insert(_Kty& _val);
        //  _Pairib  insert(const _Kty& _val);
            size_type erase(const _Kty& x);
            void clear();

            _Pr key_comp() const;
            _Pr value_comp() const;

            iterator find(const _Kty& x);
            size_type count(const _Kty& x) const;
            iterator lower_bound(const _Kty& x) const;
            iterator upper_bound(const _Kty& x) const;
    //      _Pairii equal_range(const _Kty& x) const;

            _Alloc get_allocator() const;
        };

我不断收到以下错误:

错误 1 ​​错误 C2143:语法错误:缺少 ';'在'之前

错误 3 错误 C2238: ';' 前面的意外标记

错误 5 错误 C2238:';' 前面的意外标记

错误 2 错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持默认整数

所有这些错误都是指头文件中的以下两行:

        typedef std::pair<iterator, iterator> _Pairii;
        typedef std::pair<iterator, bool> _Pairib;

我不知道为什么会出现错误。

【问题讨论】:

  • 您的标识符在 C++ 代码中是非法的:保留下划线后跟大写字母。
  • 可能编译器被迭代器typedef中的typename弄糊涂了?
  • 全部改成下划线+小写字母,没有变化
  • @Marcin 下划线 + 小写字母实际上并没有好多少,因为它们被保留在全局命名空间中。只是不要在名称的开头使用下划线 - 无论如何都没有意义。
  • 您是否包含了&lt;utility&gt; 标头?

标签: c++ std header-files std-pair


【解决方案1】:

导致这种情况的错误是您在非依赖类型名称上使用了typename

typedef typename _Skiplist_const_iterator<_Myt> const_iterator;
typedef typename _Skiplist_iterator<_Myt> iterator;

删除typename 并包含定义std::pair 的标头&lt;memory&gt; 就可以解决问题。

另请注意,您的标识符无效(以下划线开头的标识符后跟另一个下划线或大写字母被保留)并且您被允许使用可读标识符. ;-) 标准库实现使用保留标识符以避免与客户端代码冲突。但你不应该那样做。

【讨论】:

  • 删除typename后没有变化
  • 嗯。在这种情况下,如果您能告诉我们错误发生在哪里,将会有所帮助。它为我编译。
  • 如问题所述:所有错误消息均指具有_pairib_pairii 类型定义的这两行
  • @Marcin 你是#include &lt;utility&gt; 还是&lt;map&gt;
  • 是的,包括 &lt;utility&gt; 帮助。谢谢!
猜你喜欢
  • 2016-04-23
  • 2016-04-05
  • 1970-01-01
  • 2021-07-23
  • 2021-09-03
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多