C++ 通过类的模板参数专门化成员模板结构

C++ 通过类的模板参数专门化成员模板结构,c++,visual-studio,templates,partial-specialization,C++,Visual Studio,Templates,Partial Specialization,我有一门课 template <unsigned N> class TEST { public: template <unsigned P, unsigned I> struct test { static __forceinline void Run() { std::cout << 0 << std::endl; } }; template <unsigned I> s

我有一门课

template <unsigned N>
class TEST {
public:
    template <unsigned P, unsigned I>   struct test         { static __forceinline void Run() { std::cout << 0 << std::endl; } };
    template <unsigned I>               struct test <N, I>  { static __forceinline void Run() { std::cout << 1 << std::endl; } };
};
它仍然给出
0

后来我发现,当模板列表中只有一个参数时,它可以工作:

template <unsigned N>
class TEST {
public:
    template <unsigned P>   struct test         { static __forceinline void Run() { std::cout << 0 << std::endl; } };
    template <>             struct test <N>     { static __forceinline void Run() { std::cout << 1 << std::endl; } };
};
TEST::TEST::Run()
给出了“1”。

以下完整代码(我删除了
\uu forceinline
以使其与gcc兼容):

在Visual Studio 2013上,以及

1
0
关于gcc 4.8.2

如果您取消注释注释行,gcc将给出预期的
12
,而VS不会编译,出现以下错误:

1>source.cpp(12): error C2752: 'TEST<2>::test<10,10>' : more than one partial specialization matches the template argument list
1>          source.cpp(7): could be 'TEST<N>::test<N,I>'
1>          source.cpp(8): or       'TEST<N>::test<I,I>'
1>source.cpp(12):错误C2752:“TEST::TEST”:多个部分专门化与模板参数列表匹配
1> source.cpp(7):可以是“TEST::TEST”
1> source.cpp(8):或“TEST::TEST”

因此,MSV似乎(第一)专门化是针对
p==I
,而不是针对
N==p
。这显然是Visual Studio中的一个bug。

正如其他答案所述,这个问题显然是VS中的一个bug。 在MS修复此错误之前,我找到了一个实现相同功能的解决方案:

template <unsigned N>
class TEST {
public:
    template <unsigned P, unsigned I, bool Specialize = (N==P)> struct test             { static void Run() { std::cout << 0 << std::endl; } };
    template <unsigned P, unsigned I>                           struct test <P,I,true>  { static void Run() { std::cout << 1 << std::endl; } };
};
模板
课堂测试{
公众:

模板结构测试{static void Run(){std::cout输出为“1”,您的原始代码在这里:@m.s.我测试了它,这太神奇了。我在vs2013编译时得到了不同的结果。@m.s,我在vs2013上也输出0,在gcc 4.8.2上输出1。最有趣的是
test::test::Run()
在MSVS2013上为我打印
1
。@Petr是的,这和我一样。当'P==I'是“1”时。
0
1
1
0
1>source.cpp(12): error C2752: 'TEST<2>::test<10,10>' : more than one partial specialization matches the template argument list
1>          source.cpp(7): could be 'TEST<N>::test<N,I>'
1>          source.cpp(8): or       'TEST<N>::test<I,I>'
template <unsigned N>
class TEST {
public:
    template <unsigned P, unsigned I, bool Specialize = (N==P)> struct test             { static void Run() { std::cout << 0 << std::endl; } };
    template <unsigned P, unsigned I>                           struct test <P,I,true>  { static void Run() { std::cout << 1 << std::endl; } };
};