具有函数模式参数的部分专用化

Partialy specialization with function pattern parameters

本文关键字:专用 参数 函数 模式      更新时间:2023-10-16

我在下面的代码上遇到了问题:

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 个参数的模板声明如何首先定义为"主模板",随后将对其进行专用化。