2017-06-13 137 views
1

我的问题可能与this one有关,但我认为我没有“部分专用的非类型参数表达式”,或者不理解关系。C++模板专业化与非类型参数包失败

下面的代码产生具有MSVC14编译器(CPP11)一个内部错误:

template<typename T, T... Elmts> 
struct NonTyped 
{ 

}; 

template<typename T> 
struct is_NonTyped_of_type 
{ 
    template<typename TL> 
    static constexpr bool check = false; 

    template<T... Elmts> 
    static constexpr bool check<NonTyped<T, Elmts...>> = true; 
}; 

cout << is_NonTyped_of_type<int>::check<NonTyped<int, 5>> << endl; 

仅使用一个非类型参数,而不是一个非类型参数包会按预期方式工作,但是这种失败。

这是标准禁止或未定义的吗?它打破了什么规则?

任何解决方法?

非常感谢!

编辑

solution通过@StoryTeller给出实际上确实不MSVC14工作,但非常有助于了解我们这里有问题。感谢您的帮助,StoryTeller!

回答

2

Clang接受你的代码,而GCC没有。变量模板的部分专业化应该没问题。你总是可以回到使用常规类模板进行实际计算的久经考验的方式。

template<typename T> 
class is_NonTyped_of_type 
{ 
    template<typename TL> 
    struct check_impl : std::false_type {}; 

    template<T... Elmts> 
    struct check_impl<NonTyped<T, Elmts...>> : std::true_type {}; 

public: 
    template<typename TL> 
    static constexpr bool check = check_impl<TL>::value; 
}; 
+0

我很困惑,事实上编译器不能以相同的方式处理这种可能性!谢谢,我不知道我使用'constexpr'而不是'struct'是这个奇怪行为的原因! – Michel

+2

@Michel - 对,别名/变量tempaltes的处理有时很奇怪。有几个语言缺陷报告可以证明这一点。最强大的方法是使用像C++ 03中那样的类。然后,让alias /变量以方便的方式公开结果。标准库甚至可以使用新添加的类型特征。 – StoryTeller

+0

此评论非常有用!非常感谢你! – Michel