# 質問概要
現在、std::vector
を以下の Referenceを使って、C++98で作っているのですが、コンストラクタのオーバーロードがうまくいかず、コンパイルエラーが出ます。解決方法がわかりません (T T)/
質問詳細
以下のようなコードをコンパイルすると、エラーが出ます。(自作 vector は ft 名前空間に作っています。)
C++
1int main() 2{ 3 ft::vector<int> a(10, 42); <- fill constructor を呼び出したい。 4}
エラー文
Shell
1error: indirection requires pointer operand ('int' invalid) 2 this->_pointer[i] = *first; 3 ^~~~~~ 4 in instantiation of function template specialization 'ft::vector<int>::vector<int>' requested here 5 ft::vector<int> a(10, 42); 6 7(⇡ range コンストラクタが呼び出されている)
エラーが出る原因は、以下の2つのコンストラクタです。
C++
1/* fill constructor */ 2 3template<class T> 4 vector<T>::vector(size_type n, const value_type& val, const allocator_type& alloc) 5 { 6 this->_pointer = alloc.allocate(n); 7 this->_size = n; 8 this->_capacity = n; 9 10 for(size_type i = 0; i < this->_size; i++) 11 { 12 this->_pointer[i] = val; 13 } 14 } 15 16
C++
1 2/* range constructor */ 3 4 template<class T> 5 template<class InputIterator> 6 vector<T>::vector(InputIterator first, InputIterator last,const allocator_type& alloc) 7 { 8 this->_size = last - first; 9 this->_capacity = last - first; 10 this->_pointer = alloc.allocate(this->_capacity); 11 12 for(size_type i = 0; i < this->_size; i++) 13 { 14 this->_pointer[i] = *first; 15 first++; 16 } 17 } 18 19
つまり、 fill コンストラクタを起動させて、コンテナa を 10個の42で初期化したいのですが、range コンストラクタがコンパイルエラーになってしまうのです。
確かに、テンプレート引数を考えると、range コンストラクタ も呼び出せるのでエラーが出るのは最もだとは思うのですが、それだと困るのです〜
自分の所望の動作は、以下のようになっていた時、a,b が整数なら fill Constructor を呼び出し、a,b がポインタ又はイテレータなら range constructor が呼び出されるように制御したいのですが、その方法はありませんか??
int main() { ft::vector<int> vec(a, b); }
また、ライブラリのvectorはどうやってこの問題を解決しているのでしょうか??
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/15 01:26
2021/01/15 01:35
2021/01/15 01:38
2021/01/15 01:50
2021/01/15 01:53
2021/01/15 01:59
2021/01/15 02:04
2021/01/15 02:18
2021/01/15 02:38
2021/01/16 06:12
2021/01/16 06:14