Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.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++ 生成编译时整数范围时类型不完整_C++_Templates - Fatal编程技术网

C++ 生成编译时整数范围时类型不完整

C++ 生成编译时整数范围时类型不完整,c++,templates,C++,Templates,生成编译时整数范围时遇到问题。这是我的代码: #include<type_traits> #include<iostream> using namespace std; // this is needed because I'm using vs2013 template<typename T, T...Seq> struct integer_sequence{ using type = integer_sequence<T, Seq...&g

生成编译时整数范围时遇到问题。这是我的代码:

#include<type_traits>
#include<iostream>
using namespace std;

// this is needed because I'm using vs2013
template<typename T, T...Seq>
struct integer_sequence{
    using type = integer_sequence<T, Seq...>;
};

template<typename T>
struct ToMemberType {
    using type = T;
};


template<typename TTest, typename TCount, typename TResult>
struct ImplMakeIntegerRange;

template<typename T, T Begin, T End, T...Seq>
struct ImplMakeIntegerRange<
        integer_sequence<T, Begin>,
        integer_sequence<T, End>,
        integer_sequence<T, Seq...>
    >
    :
    conditional<
        is_same<
            integer_sequence<T, Begin>,
            integer_sequence<T, End>
        >::value,
        integer_sequence<T, Seq...>,
        ToMemberType <
            ImplMakeIntegerRange<
                integer_sequence<T, Begin>,
                integer_sequence<T, End - 1>,
                integer_sequence<T, End - 1, Seq...>
            >
        >
    >::type {
    static_assert(Begin <= End, "Begin <= End failed");
};

template<typename T, T Begin, T End>
using make_integer_range =
    typename ImplMakeIntegerRange <
        integer_sequence<T, Begin>,
        integer_sequence<T, End>,
        integer_sequence < T >
    >::type;

// the code below is to test if make_integer_range really works.
template<typename T>
struct PrintIntegerRange;

template<typename T, T...Seq>
struct PrintIntegerRange<integer_sequence<T, Seq...>>{
public:
    static void Print() {
        for (auto a : { Seq... }) {
            cout << a << ' ';
        }
        cout << endl;
    }
};


int main()
{
    //I expect this two print the same result.
    PrintIntegerRange<integer_sequence<int, 3, 4, 5>>::Print();
    PrintIntegerRange<make_integer_range<int, 3, 6>>::Print(); //got three error here.

}
#包括
#包括
使用名称空间std;
//这是必需的,因为我使用的是vs2013
样板
结构整数序列{
使用类型=整数\u序列;
};
样板
结构ToMemberType{
使用类型=T;
};
样板
结构IMPLMAKEINTEGERRARGE;
样板
结构IMPLMAKEINTEGERRARGE<
整数_序列,
整数_序列,
整数序列
>
:
有条件的<
你也一样吗<
整数_序列,
整数序列
>::价值,
整数_序列,
多模体<
恳求<
整数_序列,
整数_序列,
整数序列
>
>
>::类型{
静态断言(开始)
>::类型;
//下面的代码是为了测试make_integer_range是否真的有效。
样板
结构打印集成;
样板
结构打印集成{
公众:
静态无效打印(){
对于(自动a:{Seq…}){

cout我认为问题在于ToMemberType结构的使用。您必须将其从ImplMakeIntegerRange定义中删除,或者像这样提取其模板参数类型

template<typename T, T Begin, T End, T...Seq>
struct ImplMakeIntegerRange<
        integer_sequence<T, Begin>,
        integer_sequence<T, End>,
        integer_sequence<T, Seq...>
    >
    :
    conditional<
        is_same<
            integer_sequence<T, Begin>,
            integer_sequence<T, End>
        >::value,
        integer_sequence<T, Seq...>,
        typename ToMemberType <
            ImplMakeIntegerRange<
                integer_sequence<T, Begin>,
                integer_sequence<T, End - 1>,
                integer_sequence<T, End - 1, Seq...>
            >
        >::type
    >::type {
    static_assert(Begin <= End, "Begin <= End failed");
};
模板
结构IMPLMAKEINTEGERRARGE<
整数_序列,
整数_序列,
整数序列
>
:
有条件的<
你也一样吗<
整数_序列,
整数序列
>::价值,
整数_序列,
typename ToMemberType<
恳求<
整数_序列,
整数_序列,
整数序列
>
>::类型
>::类型{

静态断言(开始时缺少一个
::在
PrintIntegerRange
的整数序列之后键入
?也请不要使用命名空间std;
@erenon
整数序列
整数序列::type
实际上是相同的类型。只有最后一行阻止代码编译。