我遇到了一个非常奇怪的症状。谁能告诉我根本原因是什么?
我的VC ++编译器版本是最新的:“Microsoft Visual C ++ 2010:01019-532-2002102-70860”
重现的步骤:
\ bug \ main.cpp(54893757):致命错误 C1001:发生内部错误 在编译器中。 (编译文件 'msc1.cpp',第1420行)
要解决此问题,请尝试 简化或改变程序 靠近上面列出的位置。 请选择技术支持 Visual C ++帮助菜单上的命令, 或打开技术支持帮助 文件以获取更多信息。
注入文本中出现此错误:
d:\ bug \ main.cpp(63):参见参考资料 功能模板实例化 'XDummy Test(T)'用[编译] T = int]
构建失败。
以下是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;
}
答案 0 :(得分:5)
您是否自己尝试过任何类型的问题排查?
我可以使用您描述的上述源代码重现崩溃。当然,我收到了一些警告:
都指这一行:
auto v = f(m_Suite);
几秒钟的故障排除发现,通过注释掉整个XTest
类,代码编译并执行没有问题(最重要的是,不会崩溃编译器)。这告诉我(并且应该告诉你)问题显然位于XTest
类中的某个位置。
你不禁想知道这是否与正在生成的编译器错误有关。
那么,如果我们只是注释掉产生编译器错误的单行怎么样?你知道什么!代码编译并执行得很好!
所以在大约一分钟之内,我们已经将罪魁祸首缩小到一行代码。我不会花时间去理解你的所有代码到底是什么但是,因为我认为你可以从这里开始,因为你知道在哪里集中你的努力。首先修复这些IntelliSense错误,看看你的代码是否编译而不会使编译器崩溃。
答案 1 :(得分:-1)
编译器作者没有高度重视修复编译器中的错误,这些错误不会影响编译器从有效输入生成有效输出的能力。在这些错误中,最低优先级是那些不会无声地产生无效输出的错误。
因此,您的问题的答案很可能是因为此错误以前没有报告过,或者被分配了非常非常低的优先级。