2013-06-23 111 views
3

我想实现一个容器,它可以通过为构造函数提供值序列来接受初始元素列表。模板参数推导/替换失败

9 template <typename C, int max> 
10 struct c_array 
11 { 
12  typedef C value_type; 
13 
14  typedef C* iterator; 
15  typedef const C* const_iterator; 
16 
17  typedef C& reference; 
18  typedef const C& const_reference; 
19 
20  c_array() { } 
21  template <class T> 
22   c_array(typename T::iterator begin,typename T::iterator end) 
23   { 
24   } 
25 
26  C v[max]; 
27  operator C*() { return v; } 
28 
29  reference operator[] (ptrdiff_t i) { return v[i]; } 
30  const_reference operator[] (ptrdiff_t i) const { return v[i]; } 
31 
32  iterator begin() { return v; } 
33  const_iterator begin() const { return v; } 
34 
35  iterator end() { return v+max; } 
36  const_iterator end() const { return v+max; } 
37 
38  size_t size() const { return max; } 
39 }; 
40 
41 int main(int argc, char** argv) 
42 { 
43  std::vector<int> myvector(10,10); 
44  c_array<int,10> myarray1(myvector.begin(),myvector.end()); 
     ... 

我收到以下错误,而编译提前

... 
test.cc:56:61: error: no matching function for call to ‘c_array<int, 10>::c_array(std::vector<int>::iterator, std::vector<int>::iterator)’ 
test.cc:56:61: note: candidates are: 
test.cc:22:9: note: template<class T> c_array::c_array(typename T::iterator, typename T::iterator) 
test.cc:22:9: note: template argument deduction/substitution failed: 
test.cc:56:61: note: couldn't deduce template parameter ‘T’ 
... 

感谢,

回答

6

在声明

template <class T> 
c_array(typename T::iterator begin,typename T::iterator end) 

T在一个叫做“非方式使用被诱惑的背景“。没有合理的方法,如果您传入MyCustomIter类型的参数,编译器会猜测T可能包含typedef MyCustomIter iterator;。所以C++标准说编译器甚至不应该尝试。

相反,您可以编写函数来采取任何类型并假设/记录它应该是一个迭代器。

template <class InputIter> 
c_array(InputIter begin, InputIter end) { 
    std::copy_n(begin, max, v); 
} 
+0

+1为清楚地解释为什么你需要这种改变。一个额外的注释可能对OP来说可能是新的,对于普通函数来说,如果模板演绎不能成功,它不一定是个问题,只要能够明确指定模板参数即可。模板构造函数不存在这样的语法,因此模板参数无法推导出的模板化构造函数永远不会被调用。 – hvd

+0

+1非常感谢 –