C++ gcc为什么抱怨;错误:键入';intT&x27;模板参数';0';取决于模板参数“quot;”;?
我的编译器是GCC4.9.0。无法编译以下代码:C++ gcc为什么抱怨;错误:键入';intT&x27;模板参数';0';取决于模板参数“quot;”;?,c++,templates,c++11,variadic-templates,template-meta-programming,C++,Templates,C++11,Variadic Templates,Template Meta Programming,我的编译器是GCC4.9.0。无法编译以下代码: template<typename T, T i> struct value {}; template<typename T> struct value<T, 0> {}; // error: type 'T' of template argument '0' depends on a template parameter 模板 结构值{}; 模板 结构值{}; //错误:模板参数“0”的类型“T”依赖于模
template<typename T, T i>
struct value {};
template<typename T>
struct value<T, 0> {};
// error: type 'T' of template argument '0' depends on a template parameter
模板
结构值{};
模板
结构值{};
//错误:模板参数“0”的类型“T”依赖于模板参数
原因是什么?那么,如何解决这个问题呢?GCC是正确的,这是C++11[temp.class.spec]§8明确禁止的: 8在类模板部分专门化的参数列表中,以下限制适用:
- 部分专用的非类型参数表达式不应包含
部分专门化,除非参数表达式是简单标识符。[示例:
-[结束示例]模板结构A{}; 模板结构A{};//错误 模板结构B{}; 模板结构B{};//确定
- 与专用非类型参数对应的模板参数的类型不应为
依赖于专门化的参数。[示例:
-[结束示例]模板结构C{}; 模板结构C;//错误 模板
A类{}; int数组[5]; 模板 类A{};//错误
关于“如何解决这个问题”的问题,从目前的形式来看,恐怕没有解决办法
至于制作整数序列的原始版本,我相信您可以使用
uintmax\u t
作为非类型模板参数的类型,并在最终定义中仅将其转换为intT
。直接使用std::integral\u常量而不是整数文本:
template<typename T, typename VALUE>
struct value;
template<typename T>
struct value<T, std::integral_constant<T, 0> >
{
};
模板
结构值;
模板
结构值
{
};
当我尝试为C++11实现std::make_integer_sequence时,这对我来说效果很好。解决方案在哪里?@Angew:天哪,我努力了,它真的很顽固。。。很高兴你成功了@xmllmx您问的是为什么它不工作,而不是如何使它工作。你的问题的简短版本有一个简单的答案“这不可行”。不过,原始版本可能有不同的解决方案。然而,问题是“为什么?”@MatthieuM。我有时会忘记标准PDF中的副本看起来有多么糟糕。@xmllmx:解决方案包括不使用部分专门化。你真的需要你刚才提到的整数序列吗?它们已经存在于C++14()中。如何解决此问题?->有关一些解决方法,请参见以下问题的答案:和。
template <class T, T t> struct C {};
template <class T> struct C<T, 1>; // error
template< int X, int (*array_ptr)[X] > class A {};
int array[5];
template< int X > class A<X,&array> { }; // error
template<typename T, typename VALUE>
struct value;
template<typename T>
struct value<T, std::integral_constant<T, 0> >
{
};