为什么Visual C ++不能部分地专门化模板中的类?

时间:2018-04-24 03:58:28

标签: c++ templates visual-c++ inner-classes partial-specialization

当我尝试在Visual C ++(2015)

中运行此代码时
template<int V>
struct outer
{
    template<int U, bool>
    struct inner;
};
template<int V>
template<bool B>
struct outer<V>::inner<V, B> { enum { value = 0 }; };

int main()
{
    return outer<1>::inner<1, false>::value;
}

我收到错误

Temp.cpp(13): error C2027: use of undefined type 'outer<1>::inner<1,false>'
Temp.cpp(13): note: see declaration of 'outer<1>::inner<1,false>'
Temp.cpp(13): error C2065: 'value': undeclared identifier

然而,it compiles and runs fine on GCC和Clang。

三个问题:

  1. 如果部分特化没有部分专业化, 它在做什么?

  2. 为什么会这样?这是一个错误,或者这个代码真的有问题吗?

  3. 是否有一种解决方法可以让你仍然在内部模板类中使用内部模板类,或者是将模板参数移到外面的唯一解决方案?

1 个答案:

答案 0 :(得分:0)

这是Visual C ++ 2015(其中之一)中C ++实现的一个已知限制。

这在Visual C ++ 2017中有效,因此可能需要进行版本升级。