您的代码不是有效的 C++ 代码。请参阅下面的引文。
C++03
14.2 模板特化的名称 [temp.names]
14.2/4
当成员模板特化的名称出现在postfix -expression.
之后或之后,或者在限定 ID中的nested-name-specifier之后,并且 postfix-expression 或qualified-id 显式依赖于模板参数(14.6.2 ),成员模板名称必须以关键字 为前缀。否则,该名称被假定为命名非模板。->
template
14.2/5
如果以关键字template
为前缀的名称不是成员模板的名称,则程序格式错误。[注意:关键字可能不适用于类模板的非模板成员。] 此外,如果后缀表达式或限定ID未出现在模板范围内,则template
成员模板的名称不应以关键字为前缀. [注:与前缀的情况一样,在非严格必要的情况下允许使用前缀;即,当or左侧的表达式或嵌套名称说明符不依赖于模板参数时。]template
typename
template
->
.
C++11
14.2 模板特化的名称 [temp.names]
14.2/4
当成员模板特化的名称出现在postfix -expression.
之后或之后,或者在 qualified-id 中的nested - name-specifier之后,并且postfix-expression的对象表达式是类型相关的或nested-name-specifier在qualified-id中指的是依赖类型,但名称不是当前实例化的成员(14.6.2.1),成员模板名称必须以关键字为前缀。否则,该名称被假定为命名非模板。->
template
14.2/5
以关键字为前缀的名称template
应为模板 ID或名称应指类模板。[注意:关键字template
可能不适用于类模板的非模板成员。— end note ] [注意:与typename
前缀的情况一样,template
前缀在不是绝对必要的情况下是允许的;即,当嵌套名称说明符->
或or左侧的表达式.
不依赖于模板参数时,或者使用未出现在模板的范围内。— 尾注] [示例:
// ...
template <class T> struct B {
template <class T2> struct C { };
};
// OK: T::template C names a class template:
template <class T, template <class X> class TT = T::template C> struct D { };
D<B<int> > db;
—结束示例]
符合标准的代码
所以在这种情况下正确的语法是:
template <typename T>
struct A
{
template <typename U>
struct AA
{
};
};
template <typename V, template <typename> class W = A<V>::template AA>
// ^^^^^^^^^^^
struct B
{
};
不幸的是, VC2010也不理解有效的语法。