C ++部分模板专业化:未声明的标识符错误

时间:2019-03-05 20:56:35

标签: c++ templates partial-specialization

编写此代码的目的是为了更好地理解部分模板的专业化。我正在尝试使用三个不同的布尔值来部分专门化Vector类。

我有一个枚举(对于我的bool)定义为:

enum MY_BOOL
{
   YES,
   NO,
   MAYBE
};

对于我的主模板类,

template<class A,MY_BOOL,class B>
class Vector{};

我的部分专业课是

template<MY_BOOL b>
class Vector<A,YES,B>{};

编译器抱怨AB是未声明的标识符,而部分专用的Vector的参数太少。不要抱怨'YES'这使我感到困惑,因为AB已经在主模板类中定义了。我不需要将它们放回部分专用类的参数列表中,因为该参数列表的目的是仅包含我要专用的变量。

2 个答案:

答案 0 :(得分:1)

template<MY_BOOL b>
class Vector<A,YES,B>{};

由于未指定AB,因此会出现编译器错误。它不会使用主模板中的AB,它将仅使用专业化中定义的类型/值。

由于您希望对每个枚举值进行专业化处理,因此可以像这样

template<class A,MY_BOOL,class B>
class Vector {};

template<class A, class B>
class Vector<A, YES, B>{ /* YES stuff */ };

template<class A, class B>
class Vector<A, NO, B>{ /* NO stuff */ };

template<class A, class B>
class Vector<A, MAYBE, B>{ /* MAYBE stuff */ };

现在您对每个枚举都有一个专门化的内容。

答案 1 :(得分:0)

对YES的部分专业化应为:

scala> val df = sc.parallelize(Array((1, 2), (3, 4),(3, 4), (1, 6))).toDF("no", "age")



scala> df.show

+---+---+
| no|age|
+---+---+
|  1|  2|
|  3|  4|
|  3|  4|
|  1|  6|
+---+---+


scala> df.dropDuplicates().show()
+---+---+
| no|age|
+---+---+
|  1|  2|
|  3|  4|
|  1|  6|
+---+---+

部分专业化的含义是,您提供的模板参数与基本模板不同,并自己填写基本模板的缺失模板参数。