STLのvectorは
https://cpprefjp.github.io/reference/vector/op_constructor.html
によると,
cpp
1explicit vector(size_type n, const T& value = T(), 2 const Allocator& a = Allocator()); // (3) + (4) C++03 3 4template <class InputIter> 5vector(InputIter first, InputIter last, 6 const Allocator& a = Allocator()); // (5) C++03
とあるのですが,
例えば
cpp
1#include<vector> 2using namespace std; 3 4int main() { 5 vector<int> a(2, 3); 6 vector<int> b(begin(a), end(a)); 7 return 0; 8}
これはコンパイルできますが,似たような設計にしようとして,
cpp
1/** a.cpp **/ 2#include<vector> 3using namespace std; 4 5template<class T> 6class X { 7public: 8 size_t n; 9 X(size_t n, const T& t = T()): n(n) { 10 } 11 template<class InputIter> 12 X(InputIter fi, InputIter la): n(distance(fi, la)) { 13 } 14}; 15 16int main() { 17 vector<int> a(2, 3); 18 vector<int> b(begin(a), end(a)); 19 X<int> x(2, 3); // compile error ~~(この行ではなくdistanceでerror)~~ すみませんここも compile errorでした 20 X<int> y(begin(a), end(a)); // ok 21 return 0; 22}
とするとdistanceのところでdistance(int&, int&)がないといわれます.(追記参照)
explicit
をつけたりもしましたが変わりませんでした.
どうすればvectorのコンストラクタのような振る舞いになるでしょうか.
g++のversionは7.3.0
でした.
よろしくお願いします.
追記:
上記をコンパイルした結果です.
$ g++ a.cpp a.cpp: In instantiation of ‘X<T>::X(InputIter, InputIter) [with InputIter = int; T = int]’: a.cpp:18:16: required from here a.cpp:11:44: error: no matching function for call to ‘distance(int&, int&)’ X(InputIter fi, InputIter la): n(distance(fi, la)) { ~~~~~~~~^~~~~~~~ In file included from /usr/include/c++/7/bits/stl_algobase.h:66:0, from /usr/include/c++/7/vector:60, from a.cpp:1: /usr/include/c++/7/bits/stl_iterator_base_funcs.h:138:5: note: candidate: template<class _InputIterator> typename std::iterator_traits<_Iterator>::difference_type std::distance(_InputIterator, _InputIterator) distance(_InputIterator __first, _InputIterator __last) ^~~~~~~~ /usr/include/c++/7/bits/stl_iterator_base_funcs.h:138:5: note: template argument deduction/substitution failed: /usr/include/c++/7/bits/stl_iterator_base_funcs.h: In substitution of ‘template<class _InputIterator> typename std::iterator_traits<_Iterator>::difference_type std::distance(_InputIterator, _InputIterator) [with _InputIterator = int]’: a.cpp:11:44: required from ‘X<T>::X(InputIter, InputIter) [with InputIter = int; T = int]’ a.cpp:18:16: required from here /usr/include/c++/7/bits/stl_iterator_base_funcs.h:138:5: error: no type named ‘difference_type’ in ‘struct std::iterator_traits<int>’
(この行ではなくdistanceでerror)
と書いていた行もエラーでしたすみません…
回答2件
あなたの回答
tips
プレビュー