これが私の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() ) ; }
icpc :
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
- 特に、次の場合の効果は定義されていません:...
- そのコンポーネントで特に許可されていない限り、テンプレート コンポーネントをインスタンス化するときに、不完全な型 ([basic.types]) がテンプレート引数として使用された場合。
そしてそれに関する歴史的議論。