具有功能模式参数的部分专业化

丹尼斯·科托夫(Denis Kotov)

我在下面的代码上遇到了麻烦:

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。

除(14.5.5)中规定的以外,类模板的名称不得与任何其他模板,类,函数,变量,枚举,枚举器,名称空间或相同范围(3.3)中的类型相同。

关于您到底要问什么,它不是很明确,但是'except'子句是关键部分。这意味着无法完成“重载”类模板。

如果遵循对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个参数的模板声明定义为“主模板”,然后再进行专门说明。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有功能并模拟部分模板专业化的SFINAE

具有部分专业化的类模板参数推导

具有更多模板参数的部分专业化

具有非类型参数的部分模板专业化:GCC与MSVS

具有std :: enable_if的C ++可变参数模板部分模板专业化

具有模板化功能的专业化模板类

具有std :: if_enabled_t参数的模板功能的完全专业化

具有部分专业化的模板子类化

具有非类型参数的类的具有非类型参数的成员函数的部分专业化

没有模板参数的功能模板专业化

具有模板模板参数的类模板专业化

具有功能的管道的参数化

C ++类模板专业化,而无需重新实现所有功能

参数化和“不允许功能模板部分专业化”

具有模板化类型名的功能模板专业化

模板参数部分专业化,参数数量不定

部分专业化,后跟可变参数模板参数

无法调用具有默认参数的函数专业化,因为参数太少

尝试了解带有模板模板参数的部分模板专业化

在C ++中,为什么模板函数不能具有部分专业化?

如何解决功能模板的部分专业化问题?

C ++-可变参数模板部分专业化

无法在部分专业化中推导的模板参数

可变参数模板成员函数的部分专业化

以函数为模板参数的部分专业化拒绝

C ++ 11中具有多个模板参数的模板函数的专业化

具有非空模板参数列表的模板专业化

具有任何非类型参数的C ++模板专业化

部分模板专业化