回答編集履歴
4
別解
answer
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
`std::numeric_limits<int[]>` が存在しないから、 両方のvectorコンストラクタがエラーになりマッチしないのではないでしょうか。
|
1
|
+
~~`std::numeric_limits<int[]>` が存在しないから、 両方のvectorコンストラクタがエラーになりマッチしないのではないでしょうか。~~
|
2
2
|
|
3
3
|
追記: ↑そんなことはないようです。`std::numeric_limits<>` はどんな型にも動きます。
|
4
|
+
原因は、`first`と`last`の両方を`enable_if<>::type`にしてしまうと、`InputIterator`に何の型を当てはめるか決められなくなるためで、どちらかの`enable_if<>`をやめればよいです。
|
4
5
|
|
5
6
|
ターゲット環境に`std::iterator_traits<>`があればそれで判定するのはいかがでしょうか。`std::iterator_traits<>`がある場合、range constructor のパラメータは
|
6
7
|
```c++
|
3
std::numeric_limits について追記
answer
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
`std::numeric_limits<
|
1
|
+
`std::numeric_limits<int[]>` が存在しないから、 両方のvectorコンストラクタがエラーになりマッチしないのではないでしょうか。
|
2
2
|
|
3
|
+
追記: ↑そんなことはないようです。`std::numeric_limits<>` はどんな型にも動きます。
|
4
|
+
|
3
5
|
ターゲット環境に`std::iterator_traits<>`があればそれで判定するのはいかがでしょうか。`std::iterator_traits<>`がある場合、range constructor のパラメータは
|
4
6
|
```c++
|
5
7
|
// イテレータをデリファレンスした型がvectorのvalue_typeと等しいならOK。
|
2
コードにコメント追加
answer
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
`std::numeric_limits<char[]>` が存在しないから、 両方のvectorコンストラクタがエラーになりマッチしないのではないでしょうか。
|
2
2
|
|
3
|
-
ターゲット環境に`std::iterator_traits<>`があればそれで判定し
|
3
|
+
ターゲット環境に`std::iterator_traits<>`があればそれで判定するのはいかがでしょうか。`std::iterator_traits<>`がある場合、range constructor のパラメータは
|
4
4
|
```c++
|
5
|
+
// イテレータをデリファレンスした型がvectorのvalue_typeと等しいならOK。
|
5
6
|
// std::is_same<> はC++11からなので、ft:is_same<> を実装する
|
7
|
+
typename ft::enable_if<
|
6
|
-
|
8
|
+
ft::is_same<std::iterator_traits<InputIterator>::value_type,
|
7
|
-
|
9
|
+
value_type>::value,
|
8
|
-
|
10
|
+
InputIterator>::type first,
|
9
11
|
```
|
10
12
|
です。fill constructor に `enable_if<>` は必要ありません。
|
1
修正案を追加
answer
CHANGED
@@ -1,3 +1,10 @@
|
|
1
1
|
`std::numeric_limits<char[]>` が存在しないから、 両方のvectorコンストラクタがエラーになりマッチしないのではないでしょうか。
|
2
2
|
|
3
|
-
ターゲット環境に`std::iterator_traits<>`があればそれで判定しましょう。
|
3
|
+
ターゲット環境に`std::iterator_traits<>`があればそれで判定しましょう。`std::iterator_traits<>`がある場合、range constructor のパラメータは
|
4
|
+
```c++
|
5
|
+
// std::is_same<> はC++11からなので、ft:is_same<> を実装する
|
6
|
+
typename ft::enable_if<ft::is_same<std::iterator_traits<InputIterator>::value_type,
|
7
|
+
value_type>::value,
|
8
|
+
InputIterator>::type first,
|
9
|
+
```
|
10
|
+
です。fill constructor に `enable_if<>` は必要ありません。
|