candidate template ignored: couldn't infer template argument の理由がわかりません(TT)
#質問概要
現在、自作でstd::vector を作っているのですが、SFINAE を使ってコンパイルするコンストラクタを分けようとしてるのですが、上記のエラーが出てしまい、ます。
その理由がわかりません....
以前、関連する質問をしたのでそのリンクを載せておきます。
#質問詳細
以下のコードでコンパイルエラーがおきます(自作オブジェクトはft
名前空間に作っています)
※ 訳あって、enable_if
も自作しています
※ さらに訳あってC++98 の機能しか使ってはいけないので、型判別にはstd::numeric_limits<>::is_integer
しか使ってないです
C++
1 2int main() 3{ 4 int k = 4; 5 int array[] = {1,2,3,4,5,6,7,8}; 6 ft::vector<int> a(10, 100); 7 ft::vector<int> b(array, array + 8); <- ここでエラーが出ます 8} 9 10
エラー文
Shell
1main.cpp:22:18: error: no matching constructor for initialization of 'ft::vector<int>' 2 ft::vector<int> b(array, array + 8); 3 ^ ~~~~~~~~~~~~~~~~ 4./vector.hpp:35:12: note: candidate constructor not viable: no known conversion from 'int [8]' to 5 'typename ft::enable_if<std::numeric_limits<size_type>::is_integer, size_type>::type' 6 (aka 'unsigned long') for 1st argument 7 explicit vector( 8 ^ 9./vector.hpp:40:3: note: candidate template ignored: couldn't infer template argument <- 自分としては、このコンストラクタ(下に記載)が起動してほしいけど、してくれない。推論できないとか言われちゃう 10 'InputIterator' 11 vector( 12 ^ 13./vector.hpp:34:12: note: candidate constructor not viable: allows at most single argument 14 'alloc', but 2 arguments were provided 15 explicit vector(const allocator_type& alloc = allocator_type()); 16 ^ 17./vector.hpp:44:3: note: candidate constructor not viable: requires single argument 'x', but 2 18 arguments were provided 19 vector (const vector& x); 20 ^ 211 error generated. 22
自作vector の定義と実装は以下です(コンストラクタの部分のみ)
#####定義
C++
1 2 3 template <class T> 4 class vector 5 { 6 public: 7 /* 8 member values 9 */ 10 typedef T value_type; 11 typedef allocator<T> Allocator; 12 typedef Allocator allocator_type; 13 typedef typename allocator_type::reference reference; 14 typedef typename allocator_type::const_reference const_reference; 15 typedef typename allocator_type::pointer pointer; 16 typedef typename allocator_type::const_pointer const_pointer; 17 typedef typename allocator_type::difference_type difference_type; 18 typedef typename allocator_type::size_type size_type; 19 typedef pointer iterator; 20 typedef const_pointer const_iterator; 21 typedef std::reverse_iterator<iterator> reverse_iterator; 22 typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 23 /* 24 Constructors 25 */ 26 // default 27 explicit vector(const allocator_type& alloc = allocator_type()); 28 29 //fill constructor 30 explicit vector( 31 typename ft::enable_if<std::numeric_limits<size_type>::is_integer ,size_type>::type n, const value_type& val = value_type(), \ 32 const allocator_type& alloc = allocator_type()); 33 34 //range constructor 35 template <class InputIterator> 36 vector( 37 typename ft::enable_if<!std::numeric_limits<InputIterator>::is_integer ,InputIterator>::type first,\ 38 typename ft::enable_if<!std::numeric_limits<InputIterator>::is_integer ,InputIterator>::type last, \ 39 const allocator_type& alloc = allocator_type()); 40//COpy constructor 41 vector (const vector& x); 42
#####実装
// fill constructor template<class T> vector<T>::vector( typename ft::enable_if<std::numeric_limits<size_type>::is_integer ,size_type>::type n,\ const value_type& val, const allocator_type& alloc) { this->_pointer = alloc.allocate(n); this->_size = n; this->_capacity = n; for(size_type i = 0; i < this->_size; i++) { this->_pointer[i] = val; } } // range constructor template<class T> template<class InputIterator> vector<T>::vector( typename ft::enable_if<!std::numeric_limits<InputIterator>::is_integer ,InputIterator>::type first, \ typename ft::enable_if<!std::numeric_limits<InputIterator>::is_integer ,InputIterator>::type last ,\ const allocator_type& alloc) { this->_size = last - first; this->_capacity = last - first; this->_pointer = alloc.allocate(this->_capacity); for(size_type i = 0; i < this->_size; i++) { this->_pointer[i] = *first; first++; } }
問題が出ているのは、fill constructor と range constructor の判別のタイミングです
#####自作の enable_if は以下です
namespace ft { template <bool B, typename T> class enable_if { public: typedef T type; }; template <typename T> class enable_if<false, T> {}; } なぜ、テンプレート引数が推論できないとか言われちゃうんでしょうか... どうか皆さんの知恵を貸してください!!!!!
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/15 05:24
2021/01/15 05:40
2021/01/15 05:44
2021/01/15 05:49
2021/01/15 06:03
2021/01/15 06:11 編集
2021/01/15 06:32 編集
2021/01/15 06:37
2021/01/15 07:19
2021/01/15 07:39 編集
2021/01/15 07:45
2021/01/15 07:56
2021/01/15 08:15
2021/01/15 12:12