【发布时间】:2017-01-15 23:32:55
【问题描述】:
下面的代码有问题:
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': too many template arguments),但如果我接下来编译:
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;
};
它可以正确编译。但我找不到收到错误的规则。 我的意思不是编译器作者的解释,而是标准的解释。 有人知道吗?
【问题讨论】:
-
class Person < Name(FamilyName) >对您意味着什么? -
这只是检查类型如何放入模板实例化的模式:Person<:string> person(std::string("Denis"));
-
不是标准,但很有趣:stackoverflow.com/questions/11968994/…
-
我认为这两条注释行不是专业化的,它们不专业化任何东西。因此它们被视为类 Person 的重新声明。类不能重载,只有函数可以。
-
@Ripi2 谢谢你是对的