繁体   English   中英

模板部分专业化

[英]Template partial specialisation

有人可以解释为什么这两个专业化对编译器来说难以区分(gcc 4.5.1 @ ideone)

http://ideone.com/9tNux

template <typename... T> struct S;

template<typename A, typename B, typename... C>
struct S<A, B, C...> {
   int f() {return 1;}
};

template<typename... A, typename... C>
struct S< S<A...>, C...> {
   int f() {return 2;}
};

当我尝试实例化S<S<a, b>, a, b> o2; 编译器抱怨:

prog.cpp:20:21: error: ambiguous class template instantiation for 'struct S<S<a, b>, a, b>'
prog.cpp:6:22: error: candidates are: struct S<A, B, C ...>
prog.cpp:11:33: error:                 struct S<S<A ...>, C ...>
prog.cpp:20:21: error: aggregate 'S<S<a, b>, a, b> o2' has incomplete type and cannot be defined

当最后一个专业化改为:

template<typename... A, typename B, typename... C>
struct S< S<A...>, B, C...> {
   int f() {return 2;}
}

一切正常。

我对这个问题的理解:

typedef S<S<a, b>, c, d> S2;

这里S<a,b>更好地匹配第二个特化。 但是, c, d更适合第一个特化的剩余参数(单个arg + list vs list)。 因此它是1:1。

如果你在第二个专业化中对B进行评论,那么第二个专业化会更好地匹配,因为它更专门用于第一个参数( S<...> ),其余的同样好。

我弄得一团糟; 它现在应该没关系,但是归功于下面的@UncleBens谁做对了(并且应该得到“接受”)。


如果没有第三个版本中的B ,则在实例化S<S<X,Y,Z>, T1, T2, T3>时,您有两个部分特化,这些特殊化同样具体:

  • 第一PS: A = S<X,Y,Z>B = T1C... = T2, T3
  • 没有B第二PS: A... = X,Y,ZC... = T1, T2, T3
  • 具有B第二PS: A... = X,Y,ZB = T1C... = T2, T3

这不会在部分专业化排序中建立可比较的元素!

请注意,您可以说template <typename ...> struct S; template <typename A, typename ...B> struct S<A, B...>; 第二个比第一个更具体,因为它具有更多的非可变参数。

但另一方面,如果没有B ,当你说S<S<X,Y,Z>,T1,T2,T3> ,第一个参数在第二个PS中匹配得更好,但剩下的参数在第一个PS。 然而,在B到位的情况下,第二个PS更具体。

与此相比,部分特实际更具体的

template <typename ...A, typename B, typename ...C>
struct S<B, std::tuple<C...>, std::tuple<C...>> { /* ... */ };

现在很清楚给定实例是匹配特化还是仅匹配一般形式。 专门化具有固定数量的参数(3),因此它赢得了具有可变数量参数的另一个特化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM