gpt4 book ai didi

c++ - struct std::iterator_traits<...> 中没有名为 ‘pointer’ 的类型

转载 作者:行者123 更新时间:2023-11-28 05:27:06 26 4
gpt4 key购买 nike

这是我的 linked_list 模板的片段:

#include <iostream>
#include <iterator>

template < class >
struct linked_list {
struct iterator_base : public std::iterator< std::bidirectional_iterator_tag , int >
{
typename std::iterator_traits< iterator_base >::pointer operator -> () const {
std::cerr << __func__ ;
return nullptr ; } ;
};
using difference_type = typename std::iterator_traits< iterator_base >::difference_type ;
} ;

int main ()
{
int * inullptr = linked_list< int >::iterator_base().operator->() ;
return 0 ;
}

当我离开时using...行未注释,代码无法编译。

g++5.4:

list2.cxx:105:66: error: no type named ‘pointer’ in ‘struct std::iterator_traits<linked_list<int>::iterator_base<(linked_list<int, std::allocator<int> >::constantness)1u> >’
typename std::iterator_traits< iterator_base >::pointer operator -> () const { return &( to_obj_node( current_node_ ) -> object() ) ; }

国际电联:

list.cxx(105): error: incomplete type is not allowed typename std::iterator_traits< iterator_base >::pointer operator -> () const { return &( to_obj_node( current_node_ ) -> object() ) ; }

没有那一行,所有编译都很好。

问题是:当我评论 using difference_type = typename std::iterator_traits< iterator >::difference_type; 时会发生什么在上面的代码中(只有这样的代码才能编译)。?

============================================= =========================== res.on.functions/2.5

  1. In particular, the effects are undefined in the following cases:...
    1. if an incomplete type ([basic.types]) is used as a template argument when instantiating a template component, unless specifically allowed for that component.

和历史discussion

最佳答案

这里的错误是类型std::iterator_traits< iterator_base >仍然不完整,在您想要访问的时候 ::pointer尚未提供 pointer成员。

类(class)std::iterator_traits<iterator_base>正在由 typename std::iterator_traits< iterator_base >::difference_type 实例化,因为它用在 :: 的左侧, 因为它还没有被实例化。这会触发 linked_list<int>::iterator_base 的实例化因为 iterator_traits 的正文使用该类来定义其各种成员类型定义——例如,实例化可能发生在类似于 typedef typename Iterator::value_type value_type; 的行中在标准库中。

下面是std::iterator_traits< iterator_base >::pointer的使用在你的嵌套类中。这次,iterator_traits<iterator_base>已经被实例化,所以什么都不做,::pointer被搜索。但由于尚未宣布,因此无法找到。

请注意,当您注释掉 using 时行,代码中的任何内容都不会再实例化嵌套类主体(类模板成员的主体是“延迟实例化”),因此这不能衡量或反对嵌套类主体内部构造的有效性.

关于c++ - struct std::iterator_traits<...> 中没有名为 ‘pointer’ 的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40311194/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com