Serviceを読んで理解し、同意したものとみなします。232件3C++の勉強のためにvectorのようなものを作っています。iteratorを使ったコンストラクタ(firstとlastを取り、その間の値をvectorに構築する)を書いているのですがエラーになります。?確保するメモリのサイズを調べるためにstd::distanceを使っているのですがそのあたりでエラーが発生しています。するとテンプレートの推論で失敗しているのかもしれません。すればよいのでしょうか?ちなみにC++17を使用しています。}}追記libc++の実装を参考に宣言と定義の先頭を以下のようにして、std::vectorのイテレーターからコンストラクトしようとしたところをエラー2のようなエラーが出ます。票2もしかするとテンプレートの推論で失敗しているのかもしれません。読みやすさのため変形引用します。^直接のエラー原因は、下記テンプレートコンストラクタの存在です。定義してしまうとこの落とし穴にはまります。itererator)要件を満たすときに限る」という条件付きとなっています。いう言い回しが該当します。resolution.C++標準ライブラリ仕様は「プログラマ向けの外部公開インタフェース」を定めますが、前述のように追加要件が課せられるケースが存在するため、標準ライブラリ内部実装としてはSFINAE用のテンプレートパラメータや関数パラメータが追加されるケースがあります。(このような内部実装は明示的に許容されています。標準ライブラリ実装では、std::vectorの該当テンプレートコンストラクタにはSFINAE用の隠れたテンプレート引数が存在します。該当コンストラクタにSFINAE用の隠れたデフォルト引数が追加されています。Error)規則により該当コンストラクタの実体化は行われません。追記質問:libc++の実装を参考に宣言と定義の先頭を以下のようにして、std::vectorのイテレーターからコンストラクトしようとしたところをエラー2のようなエラーが出ます。変更差分が断片的なため不確かですが、試した限りでは問題なくコンパイルできました。追加箇所をコメント///で囲っていますので、差分ご確認ください。13:54イテレーターからのコンストラクタを呼び出してみたところ新たなエラーがでました。ここに書くのは長くなるので質問に追記しました。|3根本的な原因は、イテレータを引数に取るコンストラクタが、イテレータ以外のものまで受け付けてしまうことです。1);がエラーのもともとの始まりです。allocator_type());を使おうとしたもの、つまりベクターのサイズと初期値を指定したコンストラクタを使うつもりだったと思います。(以下、簡単のため、デフォルトの値を持つ引数は無視します)下のコードは、意図したはずのコンストラクタと、実際に呼ばれたコンストラクタを抜粋したものです。1);しかし、意図したコンストラクタの最初の引数はsize_type、つまりunsignedなので、厳密には型が一致しません。InputIterator>で、名前こそInputIteratorですが、実際には任意のデータ型と一致します。コンパイラは、テンプレートではないコンストラクタで完全一致するものが見つけられなかったため、テンプレートのコンストラクタから完全一致するものを選択したわけです。1);と、最初の引数をunsignedにすれば、目的のコンストラクタが使われ、エラーは出ません。このままだと不便ですし、予想外のエラーが起きる可能性があるので、イテレータを取るコンストラクタは、実引数が実際にイテレータでない場合は、実体化されないようにしたいところですが、なかなかに面倒でしょう。標準のライブラリと一緒に使えるようにするには、std::enable_ifやstd::iterator_traitsなどを駆使する必要がありそうです。追記ちょっと試してみました。イテレータとして使えない型Tの場合、std::iterator_traits<T>は、何もメンバを持ちません。以下、実際のコードとすれば、うまくいきそうです。テストはしていません。新しいコードでのエラーは、単に宣言の三番目の仮引数にデフォルトの値を与えてないので、実引数が二つの場合に一致していないだけです。試したコードを追加しました。これを参考にしてください。質問を少しずつ修正してダラダラ続けるのはあまりよくないと思いますが、とりあえず回答に追加しました。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。関連する質問4派生クラスのコンストラクタ5コンストラクタの初期化リストのコーディングスタイル0コンストラクタの設定0std::vectorとEigen::MatrixXdを用いた行列計算プログラムでのエラー0代入,コピーコンストラクタの挙動が分からない部分の挙動が知りたい。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。