非常に奇妙な症状に遭遇しました。根本的な原因が何であるかを誰が教えてくれますか?
私の VC++ コンパイラのバージョンは最新です: "Microsoft Visual C++ 2010 : 01019-532-2002102-70860"
再現する手順:
- 空の win32 コンソール プロジェクトを作成する
- main.cpp という名前の新しい cpp ファイルを追加します。
- 次のコードを main.cpp に貼り付けます
- コンパイル
- コンパイラがクラッシュし、次のメッセージが報告されます。
\bug\main.cpp(54893757): 致命的なエラー C1001: コンパイラで内部エラーが発生しました。(コンパイラ ファイル 'msc1.cpp'、1420 行目)
この問題を回避するには、上記の場所の近くでプログラムを単純化または変更してみてください。詳細については、Visual C++ ヘルプ メニューのテクニカル サポート コマンドを選択するか、テクニカル サポート ヘルプ ファイルを開いてください。
挿入されたテキストでこのエラーが発生しました:
d:\bug\main.cpp(63) : [ T=int ] でコンパイルされている関数テンプレートのインスタンス化 'XDummy Test(T)' への参照を参照してください
ビルドに失敗しました。
以下は、main.cpp のソース コードです。
#include <vector>
template<class It_>
struct trait_dummy
{
static const int value = std::tr1::is_convertible<typename iterator_traits<It_>::iterator_category, int>::value;
};
template<class It_>
class X
{
public:
template<class T_>
X(T_& rColl)
{}
};
template<class T_>
X<typename T_::iterator> f(T_ rColl, std::false_type)
{
return X<typename T_::iterator>(rColl);
}
template<class T_>
auto f(T_& rColl) -> decltype(f(rColl, std::false_type()))
{
return f(rColl, std::false_type());
}
template<class It_>
X<It_> f(It_ first, size_t nSize, typename std::tr1::enable_if<trait_dummy<It_>::value>::type* dummy = 0)
{
return X<It_>(first, first + nSize);
}
class XTest
{
public:
void foo()
{
auto v = f(m_Suite);
}
std::vector<int> m_Suite;
};
const int g_dummy = 0;
class XDummy
{
public:
XDummy(int, int, int, int dummy = g_dummy)
{}
};
template<class T>
XDummy Test(T)
{
return XDummy(0, 0, 0);
}
int main()
{
Test(0);
//XTest().foo();
return 0;
}