成员功能的部分专业化
Partial specialization of member function
可能重复:
“无效使用不完整类型”部分模板专用化错误
为什么我能做到这一点:
template <typename T>
struct A
{
void foo(int);
};
template <>
void A<int>::foo(int)
{
}
但不是这个:
template <typename> struct C {};
template <typename T>
struct A
{
void foo(int);
};
template <typename T>
void A<C<T> >::foo(int)
{
}
对于第二种情况,GCC给出以下错误:
test.cpp:10:23: error: invalid use of incomplete type 'struct A<C<T> >'
test.cpp:4:8: error: declaration of 'struct A<C<T> >'
编辑:
在解释为什么不允许使用第二个示例时,还请考虑将成员函数也作为模板对哪个示例有效,哪个示例无效没有影响。也就是说,这仍然有效:
template <typename T>
struct A
{
template <typename U>
void foo(U);
};
template <>
template <typename U>
void A<int>::foo(U)
{
}
但这不是:
template <typename> struct C {};
template <typename T>
struct A
{
template <typename U>
void foo(U);
};
template <typename T>
template <typename U>
void A<C<T> >::foo(U)
{
}
因此,原因不可能是函数模板只能完全专业化,因为第三个示例不是完全专业化(模板参数U
仍然存在),但它仍然有效。
函数模板只能完全专业化,不能部分专业化。
您使用的事实是,类模板的成员函数本身就是函数模板,因此此规则仍然适用。
至于您的编辑:以下内容可以明确(即完全)专门化,从14.7.3/1开始:
以下任何一项的明确专业化:
--功能模板
--类模板
--类模板的成员函数
--类模板的静态数据成员
--类模板的成员类
--类模板的成员枚举
--类的成员类模板或类模板
--类的成员函数模板或类模板
可以通过
template<>;
引入的声明进行声明
我强调了适用于你案件的两种说法。在没有任何其他明确规定的情况下,这些实体可以而不是部分专门化。
相关文章:
- 类模板的成员功能的定义在单独的TU中完全专业化
- 特定好友功能专业化
- 如何部分专业化功能以用元组元素作为参数调用功能
- 功能模板参数包,然后是模板参数和专业化
- 不允许功能模板的部分专业化背后的理由是什么?
- 在此功能[ - wuninitialization]中使用非专业化
- 模板专业化的情况下,如果有变态模板功能
- 如何在另一个名称空间内从另一个命名空间内明确专业化功能模板
- 为什么VS2017拒绝我的功能模板专业化,而不是VS2015拒绝
- 仅适用于单个功能的部分模板专业化
- 功能模板专业化具有模板打字名称
- 对完整模板专业类成员功能的未定义引用,但不是部分专业化
- 特定模板类型的功能模板专业化
- 功能模板专业化中的bool返回值
- C 将lambda函数用作模板功能专业化
- 如何正确设计和实施功能模板专业化
- Clang无法在模板类专业化中编译模板功能,该模板类专业化与模板声明具有 *不同的返回类型 *
- 统一功能使用模板专业化和接口来调用实例和原始类型
- 当使用Tempate作为参数时,功能模板专业化
- 模板功能实例化和专业化