具有函数模式参数的部分专用化
Partialy specialization with function pattern parameters
我在下面的代码上遇到了问题:
template<typename Name>
class Person;
template<typename Name, typename FamilyNmae>
class Person {};
template<typename Name, typename FamilyName>
class Person < Name(FamilyName) >
{
public:
Person(Name a)
: k{ a }
{
}
private:
Name k;
FamilyName l;
};
这段代码无法编译(C2977 'Person':模板参数太多),但是如果我接下来这样做:
template<typename Name>
class Person;
//template<typename Name, typename FamilyNmae>
//class Person {};
template<typename Name, typename FamilyName>
class Person < Name(FamilyName) >
{
public:
Person(Name a)
: k{ a }
{
}
private:
Name k;
FamilyName l;
};
它可以正确编译。但是我找不到收到错误的规则。我的意思不是编译器编写者的解释,而是标准中的解释。有人知道吗?
在最新的公开草案中,请参阅 14.0.0.5(如下所示)和 14.5.5。
类模板不得与任何其他模板同名, 类、函数、变量、枚举、枚举器、命名空间或类型 在同一范围 (3.3) 中,但 (14.5.5) 中规定的除外。
关于你到底在问什么,它并没有那么明确,但"例外"条款是关键部分。这意味着无法完成"重载"类模板。
如果您遵循对 14.5.5 的引用,您可以看到您想要做的事情只能通过模板专用化来完成。
使用 14.5.5.3 作为如何正确专用化类模板的指南,您可以执行以下操作:
class EmptyName {}; //just a placeholder
template<typename Name, typename FamilyName>
class Person {};
template<typename Name>
class Person<Name, EmptyName> {};
请注意,具有 2 个参数的模板声明如何首先定义为"主模板",随后将对其进行专用化。
相关文章:
- 具有常量引用参数的函数模板专用化
- 通过依赖类型使用非类型模板参数的单类型模板参数类模板的部分专用化
- 具有多个参数的模板化类专用化,其中一个模板参数是模板本身
- 具有可变参数非类型参数的模板专用化
- 类专用化,没有用作专用化模板参数的类的模板参数
- 基于枚举参数调用专用模板方法
- 检查类是否具有模板专用化(使用布尔值或 int 等模板参数)
- 专用于可变参数模板成员函数
- 如何将模板类专用化为也接受模板模板参数
- 调用模板专用化,具有更多参数的单参数模板调用的特定值
- 有没有办法根据 lambda 参数返回类型部分专用化我的模板化函数?
- C++ 将派生类的成员函数指针作为参数传递时选择了错误的模板专用化
- cpp 模板专用化,错误说参数 1 的类型为 T,这取决于参数 T
- 具有不同非类型模板参数的模板类部分专用化
- 带有void类型和参数的C++11模板专用化
- 类模板专用化演绎是否应该考虑演绎指南参数初始化?
- 使用模板模板参数进行模板定义的函数专用化
- 在模板专用化中使用非类型模板模板参数
- C++具有可变参数专用参数的模板,用于参数数量
- 具有专用参数的类方法