Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ gcc为什么抱怨;错误:键入';intT&x27;模板参数';0';取决于模板参数“quot;”;?_C++_Templates_C++11_Variadic Templates_Template Meta Programming - Fatal编程技术网

C++ gcc为什么抱怨;错误:键入';intT&x27;模板参数';0';取决于模板参数“quot;”;?

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”依赖于模

我的编译器是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”依赖于模板参数

原因是什么?那么,如何解决这个问题呢?

GCC是正确的,这是C++11[temp.class.spec]§8明确禁止的:

8在类模板部分专门化的参数列表中,以下限制适用:

  • 部分专用的非类型参数表达式不应包含 部分专门化,除非参数表达式是简单标识符。[示例:

    模板结构A{};
    模板结构A{};//错误
    模板结构B{};
    模板结构B{};//确定
    
    -[结束示例]

  • 与专用非类型参数对应的模板参数的类型不应为 依赖于专门化的参数。[示例:

    模板结构C{};
    模板结构C;//错误
    模板A类{};
    int数组[5];
    模板类A{};//错误
    
    -[结束示例]

我认为第2点是这里最相关的一点


关于“如何解决这个问题”的问题,从目前的形式来看,恐怕没有解决办法


至于制作整数序列的原始版本,我相信您可以使用
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> >
{
};