我在下面的代码上遇到了麻烦:
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] 删除。
我来说两句