类定义之外的部分模板专用化
Partial template specialization outside class definition
我可以在类声明中使用部分模板专用化
template<class T1, class T2>
struct A
{
void foo() { cout << "general"; }
};
template<class T1>
struct A<T1, int>
{
void foo() { cout << "partial specialization"; }
};
但是当我试图在类声明之外这样做时
template<class T1, class T2>
struct A
{
void foo();
};
template<class T1, class T2>
void A<T1, T2>::foo() { cout << "general"; }
template<class T1>
void A<T1, int>::foo() { cout << "partial specialization"; }
我收到以下错误:
无效使用不完整的类型«结构A<T1,int>"
当您想要重新定义所有成员时,使用第一种方法不是问题,但是如果您只想重新定义一种方法而不对所有其他方法进行代码重复,该怎么办?
那么,是否可以在类定义之外使用部分模板专用化?
当您想要重新定义所有成员时,使用第一种方法不是问题,但是如果您只想重新定义一种方法而不对所有其他方法进行代码重复,该怎么办?
这是可以使用特征技术的地方。见 http://www.boost.org/community/generic_programming.html#traits
一些用法:
template <class T1, class T2>
struct ATraits {
static void foo() {}
};
template <class T1>
struct ATraits<T1,int> {
static void foo() {}
};
template <class T1, class T2>
struct A {
void foo() { ATraits<T1,T2>::foo(); }
};
在失败的示例中:
template<class T1>
void A<T1, int>::foo() { cout << "partial specialization"; }
您指的是尚未定义的 A 专用化(您在第二个示例中仅定义了完整的模板)。
如果在引用之前添加专用化,它确实应该有效:
template <class T1>
struct A<T1, int>
{
void foo ();
};
template <class T1>
void A<T1, int>::foo ()
{
/* something */
};
c++ 标准禁止在没有完全专用外部模板的情况下专门化方法。所以是的,这是不可能的。我不确定它是否对 c++11 有效,但我怀疑它是。
解决此问题的一种方法是像在第一个示例中所做的那样专门化外部模板。
顺便说一句,这可能是另一种解决方法:
template<class T1, class T2>
struct A
{
template<unsigned int I>
void foo() { cout << "general"; }
template<>
void foo<2> () { cout << "specialization"; }
};
这是有效的,因为这不是专用化,而是该方法的不同模板。
这里讨论相同的主题:部分模板专用化的"无效使用不完整类型"错误
+1 对于 tozka 的解决方案,如果 A 不需要知道 I 除了 foo(),这是一个很好的解决方法。否则,请查看上述问题的答案。
相关文章:
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- C++模板专用化 - 无法匹配函数定义
- 如何使用 STL 排序对具有模板专用化的自定义类对象进行排序?
- 为什么模板专用化需要内联定义?
- 模板专用化会导致未定义的引用错误
- 对专用模板成员的未定义引用
- 在模板类内部定义的枚举上的嵌套类的部分专用化
- 没有针对完全专用模板类的外联虚拟方法定义
- 使用模板模板参数进行模板定义的函数专用化
- 如何从具有专用化的类模板定义静态成员变量?
- 如何为模板化类的模板化函数定义模板专用化
- C++模板专用化成员函数的定义
- 仅为某些模板专用化定义转换运算符:预期类型/预期类型说明符
- 如何在另一个类模板中定义完全专用类的构造函数
- C++跨文件共享的模板专用化定义
- 如何专用/分配自定义内存位置,以便可以在C 中编辑该位置
- 元组的定义和初始化,其组件属于同一模板化类,但具有不同的专用化
- 在子类中定义可变参数函数专用化
- 为类模板的单个成员定义专用化
- UE4自定义专用服务器(碰撞,命中框)