首页 > 解决方案 > 如何使用模板构造函数定义推导指南?

问题描述

为了简化我的问题,我将std::unique_lock用作解释的工具。std::unique_lock 有一个模板参数,即互斥锁。但是,它的构造函数也是一个模板函数unique_lock(TMutex &, const chrono::duration<_Rep, _Period>&)

当一个人使用它时,可以写:

 auto lock = std::unique_lock(my_mutex, 5s);

所以,问题是:如何为此写出演绎指南(不改变行为),怎么做?

到目前为止我最好的尝试:

template<typename _Mutex>
template<typename _Rep, typename _Period>
unique_lock(_Mutex &, const chrono::duration<_Rep, _Period>&) -> unique_lock<_Mutex>;

不幸的是,clang 不接受这一点:

错误:模板特化或离线模板定义中的多余模板参数列表

标签: c++templatesc++17ctad

解决方案


GCC 对此有更好的错误消息:

错误:模板参数列表过多

您可以将其更改为单个模板参数列表,如下所示:

template<typename _Mutex, typename _Rep, typename _Period>
unique_lock(_Mutex &, const chrono::duration<_Rep, _Period>&) -> unique_lock<_Mutex>;

它有效。

从您问题中的评论来看,您似乎在混合 CTAD 和专业化。

你没有专攻unique_lock. 不是成员函数,也不是构造函数,您只是在定义一个推导指南。更具体地说,来自cppreference

用户定义的推导指南的语法是带有尾随返回类型的函数声明的语法 [...] 推导指南不是函数 [...]

请注意,它具有声明的语法,而不是特化。只是和你预想的不一样。


推荐阅读