teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

別解

2021/01/15 06:45

投稿

int32_t
int32_t

スコア21933

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 について追記

2021/01/15 06:45

投稿

int32_t
int32_t

スコア21933

answer CHANGED
@@ -1,5 +1,7 @@
1
- `std::numeric_limits<char[]>` が存在しないから、 両方のvectorコンストラクタがエラーになりマッチしないのではないでしょうか。
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

コードにコメント追加

2021/01/15 05:43

投稿

int32_t
int32_t

スコア21933

answer CHANGED
@@ -1,10 +1,12 @@
1
1
  `std::numeric_limits<char[]>` が存在しないから、 両方のvectorコンストラクタがエラーになりマッチしないのではないでしょうか。
2
2
 
3
- ターゲット環境に`std::iterator_traits<>`があればそれで判定しましょう。`std::iterator_traits<>`がある場合、range constructor のパラメータは
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
- typename ft::enable_if<ft::is_same<std::iterator_traits<InputIterator>::value_type,
8
+ ft::is_same<std::iterator_traits<InputIterator>::value_type,
7
- value_type>::value,
9
+ value_type>::value,
8
- InputIterator>::type first,
10
+ InputIterator>::type first,
9
11
  ```
10
12
  です。fill constructor に `enable_if<>` は必要ありません。

1

修正案を追加

2021/01/15 05:13

投稿

int32_t
int32_t

スコア21933

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<>` は必要ありません。