铛。致命错误:递归模板实例化超出最大深度

时间:2016-08-27 10:31:03

标签: c++11 recursion variadic-templates clang++

我的课程<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.NeverMind.MainClass.android" android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:icon="@mipmap/extra" android:label="@string/app_name" android:theme="@style/GdxTheme" > <meta-data android:name="com.google.android.gms.games.APP_ID" android:value="@string/app_id" /> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <activity android:name="com.NeverMind.DontFall.android.AndroidLauncher" android:label="@string/app_name" android:screenOrientation="sensorPortrait" android:configChanges="keyboard|keyboardHidden|orientation|screenSize"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.mopub.mobileads.MoPubActivity" android:configChanges="keyboardHidden|orientation|screenSize"/> <activity android:name="com.mopub.mobileads.MraidActivity" android:configChanges="keyboardHidden|orientation|screenSize"/> <activity android:name="com.mopub.common.MoPubBrowser" android:configChanges="keyboardHidden|orientation|screenSize"/> <activity android:name="com.mopub.mobileads.MraidVideoPlayerActivity" android:configChanges="keyboardHidden|orientation|screenSize"/> </application> </manifest> 类似于Index

std::integer_sequence

我想用序列N-1,N-2,......,2,1,0填充它。

template<std::size_t... NValues>
struct Index { };

在clang编译器(3.7.0)上,它产生

  

致命错误:递归模板实例化超出了最大深度   256个

Example

它在VS和GCC上运行良好。也许我做错了什么?或者是编译器错误?

2 个答案:

答案 0 :(得分:2)

在我看来就像一个clang编译器bug。如果你不使用前向声明,它也会在clang上编译:

template<std::size_t N>
struct MakeIndex
{
private:
    template<std::size_t I, std::size_t... NIndexValues>
    struct _Make
    {
        using Type = typename _Make<I - 1, NIndexValues..., I-1>::Type;
    };
    template<std::size_t... NIndexValues>
    struct _Make<0, NIndexValues...>
    {
        using Type = Index<NIndexValues...>;
    };
public:
    using Type = typename _Make<N>::Type;
};

live example

答案 1 :(得分:1)

它看起来像编译器错误,但我不确定问题是否与clang或gcc和msvc有关。

看起来clang在使用0调用时不会使用模板特化。(您可以添加静态断言以使错误更具可读性。)

您遇到的问题与您定义的using相关联。目前编译器正在使用它来解析它,它只知道_Make的单个定义,它不是专门的,并且在某种程度上实例化模板,它只使用这些信息。 如果我们之前添加了特化,它就会编译。

live example

由于GCC在没有前向声明的情况下没有编译,所以声明是查找的必要条件,所以我猜想GCC正在解析一个实际上当时没有声明的类,它就是很可能不应该这样做。

但是,为了确保正确的行为,我建议只记录a bug。如果它是编译器中的一个错误,它就会被登录,它们很可能会解释为什么另一个错误,您可以使用它来记录the second bug