0

これが私の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

  1. 特に、次の場合の効果は定義されていません:...
    1. そのコンポーネントで特に許可されていない限り、テンプレート コンポーネントをインスタンス化するときに、不完全な型 ([basic.types]) がテンプレート引数として使用された場合。

そしてそれに関する歴史的議論

4

2 に答える 2

0
#include <iterator>

struct OK_1: std::iterator<std::bidirectional_iterator_tag, int> {};
using Pointer_1 = typename std::iterator_traits<OK_1>::pointer;

struct Nah
{
    using Pointer_nah = typename std::iterator_traits<Nah>::pointer;    //!
};

auto main() -> int
{}

の宣言の時点でPointer_nah、型Nahは不完全な型です。

iterator_traitspointerその定義を見つけるために、その型の中を調べる必要があります。

しかし、それには再帰的に の定義が必要ですiterator_traits<Nah>

等々。

しかし、要点:が宣言さNahれている時点で不完全です。不完全とは、クラスが完全にはわかっていないことを意味します。特に、そのサイズはここでは不明であるため、 に渡すことはできません。Pointer_nahsizeof

それがあなたのコンパイラの一人が叫んだ理由だと思います。

エラー: 不完全なタイプは許可されていません

于 2016-10-28T20:08:15.747 に答える