【问题标题】:Incomplete type when generating compile time integer range生成编译时整数范围时的不完整类型
【发布时间】:2014-12-21 11:37:33
【问题描述】:

我无法生成编译时整数范围。这是我的代码:

#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.

}

上面的代码从未编译过。最后一行产生三个错误信息:

  1. 错误 C2027:使用未定义类型“PrintIntegerRange”
  2. 错误 C3861:“打印”:找不到标识符
  3. IntelliSense:不允许不完整的类型

再次,我使用的是 vs2013。我哪里错了?

编辑: 附言。如果最后一行被删除,代码编译并得到预期的结果。

【问题讨论】:

  • 在 integer_sequence 之后的 PrintIntegerRange&lt;integer_sequence&lt;int, 3, 4, 5&gt;&gt; 中缺少 ::type?也请不要使用using namespace std;
  • @erenon integer_sequence&lt;&gt;integer_sequence&lt;&gt;::type 实际上是同一类型。只有最后一行阻止代码编译。

标签: c++ templates


【解决方案1】:

我认为问题在于 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");
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 2013-10-29
    • 2014-01-25
    相关资源
    最近更新 更多