为什么参数推导在此模板模板参数中不起作用

时间:2019-06-18 11:17:52

标签: c++ templates c++14 template-deduction template-templates

我有以下模板函数,该函数具有模板模板参数作为参数。

template<typename T, 
         template <typename... ELEM> class CONTAINER = std::vector>
void merge(typename CONTAINER<T>::iterator it )
{
   std::cout << *it << std::endl;
}

以下代码使用此代码。

std::vector<int> vector1{1,2,3};
merge<int>(begin(vector1));

它可以正常工作,但是当我使用

merge(begin(vector1));

它无法推断出T的类型。

我认为它可以从std::vector<int>::iterator it;推断出类型为int

为什么编译器无法推断类型?

1 个答案:

答案 0 :(得分:6)

  

我认为它可以从@PostMapping(value = "/getTransactionByMobile") public List<TransactionDetailsVO> getTransactionDetailsByMobile( @RequestBody String mobileNo // Add @RequestBody ) { // ... } 推断类型为int。

     

为什么编译器无法推断类型?

否。

编译器不能:寻找“非推论上下文”以获取更多信息。

期望扣除是不合理的。

假设一个类如下

std::vector<int>::iterator it;

类型template <typename T> struct foo { using type = int; }; 总是 typeint类型是什么。

并假设一个函数如下

T

接收到template <typename T> void bar (typename foo<T>::type i) { } 值(int始终为typename foo<T>::type)。

应从以下调用中推导哪种int类型?

T