我的课程<?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个
它在VS和GCC上运行良好。也许我做错了什么?或者是编译器错误?
答案 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;
};
答案 1 :(得分:1)
它看起来像编译器错误,但我不确定问题是否与clang或gcc和msvc有关。
看起来clang在使用0调用时不会使用模板特化。(您可以添加静态断言以使错误更具可读性。)
您遇到的问题与您定义的using
相关联。目前编译器正在使用它来解析它,它只知道_Make
的单个定义,它不是专门的,并且在某种程度上实例化模板,它只使用这些信息。
如果我们之前添加了特化,它就会编译。
由于GCC在没有前向声明的情况下没有编译,所以声明是查找的必要条件,所以我猜想GCC正在解析一个实际上当时没有声明的类,它就是很可能不应该这样做。
但是,为了确保正确的行为,我建议只记录a bug。如果它是编译器中的一个错误,它就会被登录,它们很可能会解释为什么另一个错误,您可以使用它来记录the second bug。