C++:模板模板类的部分专用化
C++: partial specialization of template template classes
以下代码:
using namespace std;
template <typename X>
class Goo {};
template <typename X>
class Hoo {};
template <class A, template <typename> class B = Goo >
struct Foo {
B<A> data;
void foo1();
void foo2();
};
template <typename A>
void Foo<A>::foo1() { cout << "foo1 for Goo" << endl;}
int main() {
Foo<int> a;
a.foo1();
}
给我一个编译器错误:
test.cc:18: error: invalid use of incomplete type 'struct Foo<A, Goo>'
test.cc:11: error: declaration of 'struct Foo<A, Goo>'
为什么我不能部分专门化foo1()?如果不是这样,我该怎么做?
我还有一个问题:如果我只想为A=int,B=Hoo定义foo2(),该怎么办而不是任何其他组合,我该怎么做?
函数模板只能是完全专用的,而不能是部分专用的。
类模板的成员函数是自动的函数模板,它们可能确实是专门的,但只是完全的:
template <>
void Foo<int, Goo>::foo1() { } // OK
您可以部分专门化整个类,然后重新定义它:
template <typename A>
struct Foo<A, Goo>
{
// ...
};
(详见14.7.3。)
模板仍然有两个参数,您必须这样写:
template <typename A, template <typename> class B>
void Foo<A,B>::foo1() { cout << "foo1" << endl;}
默认值已经指定,并且只需要指定一次。从那时起,它就像其他任何两个参数的模板一样。无论B是什么(默认值还是其他值),此代码都将适用。如果您希望为特定的B指定不同的行为,,则将对类进行专门化,而不仅仅是对方法进行专门化。
(经过大量编辑)
相关文章:
- .cpp和.h文件中的模板专用化声明
- 调用专用模板时出错"no matching function for call to [...]"
- 模板专用化(按容器):value_type
- 静态数据成员模板专用化的实例化点在哪里
- 特征 3 类的模板专用化
- Visual Studio 2017 不允许我创建 C++ 专用模板
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- 具有常量引用参数的函数模板专用化
- 使用其他模板的模板专用化
- 使用专用显卡进行 OpenGL 渲染时帧速率较低
- 嵌套模板显式专用化
- 如何检查模板专用化是否是基本模板的子类?
- C++:部分模板专用化用例
- 通过依赖类型使用非类型模板参数的单类型模板参数类模板的部分专用化
- 使用对象的基类部分模板专用化对对象进行哈希处理::哈希
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- 为什么依赖模板类型在部分专用化中不可推导?
- 如何为静态常量模板化专用整数值分配存储
- 模板类的部分模板专用化,如 std::function
- 合并一组模板专用化