c++ - 如何在模板类的方法上使用 std::enable_if 通过专业化单独声明和定义
问题描述
我正在尝试使用专业化在头文件和实现之间拆分模板类,但我希望一种方法只出现在某些专业化中。
头文件:
template <typename T>
class A
{
public:
void foo();
void bar();
template<typename U = T, typename std::enable_if<std::is_convertible<int,U>::value>::type* = nullptr>
void special();
};
实施:
template<typename T>
void A<T>::foo()
{
...
}
template<typename T>
void A<T>::bar()
{
...
}
template<typename T, typename std::enable_if<std::is_convertible<int,T>::value>::type>
void A<T>::special()
{
...
}
// generate specializations
template
class A<float>;
template
class A<int>;
template
class A<std::string>;
但是,error: declaration is incompatible with function template "void A<T>::special()"
当我像这样尝试它时,或者当我将它移动std::enable_if
为返回类型时,我不断得到。定义应该如何匹配这个方法的声明special()
?
解决方案
这段代码有一些问题。在声明中,您有一个额外的尖括号。此外,*
紧跟其后的=
将始终被解释为单个标记*=
;在此代码中,它们必须用空格分隔,以便*
将 解释为形成指针并=
声明模板参数的默认值。因此,声明应为:
template<typename U = T,
typename std::enable_if<std::is_convertible<int,U>::value>::type* = nullptr>
void special();
在定义中,由于是定义类模板的成员模板,所以需要先写出类模板的模板参数列表,再写出成员模板。此外,您的定义中没有足够的模板参数:记住,U
也在那里,它是U
,不是T
,需要出现在is_convertible
部分中:
template <typename T>
template <typename U, typename std::enable_if<std::is_convertible<int,U>::value>::type*>
void A<T>::special()
{
// ...
}
请注意,U
此处的确切拼写并不重要:我们可以重新标记U
,因为它是“虚拟变量”:
template <typename T>
template <typename V, typename std::enable_if<std::is_convertible<int,V>::value>::type*>
void A<T>::special()
{
// ...
}
但是,除了重新标记之外,所有其他细节都必须完全匹配。
推荐阅读
- javascript - vue api $slots.default 在使用 v-if 在插槽内渲染时不会再次评估
- sql-server - 如何使用 value() 函数在 SQL Server 中迭代 XML 字段
- django - 强制转换为 Unicode:需要字符串或缓冲区,找到 FieldFile
- javascript - 单击相应复选框时如何启用禁用的锚按钮
- python - 在 Django 模板中获取模型名称
- javascript - 如何正确地将事件侦听器添加到 React useEffect 挂钩?
- angular - Angular2中的过滤器()
- python - Discord.py:在检查中使用特殊响应导致不同的输出
- xamarin - RecyclerView - 如何滚动到所需数据项的位置(通过绑定)?
- android - FirebaseRemoteConfigClientException:Firebase 安装未能获取安装身份验证令牌以进行获取