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

时间:2017-01-15 23:32:56

标签: c++ templates generics

我遇到以下代码的问题:

    total_goals  home_team_id  away_team_id  home_goals  away_goals  home_rolling_avg  away_rolling_avg
0             2          1277          1241           1           1               NaN               NaN
1             3          1245          1249           2           1               NaN               NaN
2             1          1242          1246           0           1               NaN               NaN
3             4          1261          1248           1           3               NaN               NaN
4             2          1259          1240           2           0               NaN               NaN
5             3          2981          1268           1           2               NaN               NaN
6             1          1244          1255           1           0               NaN               NaN
7             1          1254          1276           1           0               NaN               NaN
8             7          1247         12140           5           2               NaN               NaN
9             3          5681          1270           2           1               NaN               NaN
10            1          1249          5681           0           1               NaN               NaN
# in line 10 above, 'home_rolling_avg' should show 3 (3/1)

此代码无法编译(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;
};

它正确编译。但我无法找到根据哪个收到错误的规则。 我的意思不是来自编译器编写器的解释,而是来自标准。 有人知道吗?

1 个答案:

答案 0 :(得分:0)

在最新的publicly available draft中,请参见14.0.0.5(如下所示)和14.5.5。

  

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

关于你究竟在问什么,这并不是那么明确,但除了&#39;条款是关键部分。它意味着“超载”#39;类模板无法完成。

如果您遵循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个参数的模板声明首先定义为&#34;主要模板&#34;之后你会专攻。