Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ VS2008内部编译器错误_C++_Visual Studio_Compiler Construction_Visual C++_C1001 - Fatal编程技术网

C++ VS2008内部编译器错误

C++ VS2008内部编译器错误,c++,visual-studio,compiler-construction,visual-c++,c1001,C++,Visual Studio,Compiler Construction,Visual C++,C1001,在尝试从MSVC6切换到MSVC2008时,我始终遇到内部编译器错误。在对程序的不同部分进行了大量注释之后,我将错误追溯到两个不同CPP文件中的两行代码。这两个CPP文件都编译成功,但在某种程度上会影响错误是否显示在其他文件中 这两行都涉及实例化几个复杂的嵌套模板。它们似乎也是应用程序中唯一使用抽象类作为模板参数之一的地方。也就是说,我还不能确定这个问题是否涉及抽象类或模板,这是我注意到的最明显的事情。我甚至不能确定这些线是否有意义。不过,下面是它们的样子: m_phDSAttributes =

在尝试从MSVC6切换到MSVC2008时,我始终遇到内部编译器错误。在对程序的不同部分进行了大量注释之后,我将错误追溯到两个不同CPP文件中的两行代码。这两个CPP文件都编译成功,但在某种程度上会影响错误是否显示在其他文件中

这两行都涉及实例化几个复杂的嵌套模板。它们似乎也是应用程序中唯一使用抽象类作为模板参数之一的地方。也就是说,我还不能确定这个问题是否涉及抽象类或模板,这是我注意到的最明显的事情。我甚至不能确定这些线是否有意义。不过,下面是它们的样子:

m_phDSAttributes = new SObjDict<RWCString, SIDataSource>(&RWCString::hash);

这通常发生在模板实例化中。不幸的是,这可能是由许多因素造成的,但99%的时间您的代码都在微妙地调用未定义的行为

开始把它分解成更小的部分。我的第一个猜测是指向静态函数的指针将成为问题。您可以在构造函数中使用相同的参数创建一个伪非模板类吗?如果在模板中不使用抽象类,它会编译吗

看来我把你送错方向了,以下是2008年的汇编:

class thing {
public:
    static void hash( short sht ) {
    }

    void hash( long lng ) {
    }
};

class thing2 {
public:
    thing2( void (short ) ){}
};

int _tmain(int argc, _TCHAR* argv[])
{
    thing2* t = new thing2( &thing::hash );
    delete t;
    return 0;
}

尽管如此,原则仍然是删除/替换复杂元素,直到您有了可编译的代码,并且您将知道是什么导致了问题。

假设
p2symtab.c
是符号表代码的一部分。这将立即解释升级是如何导致它的;此代码已被重写。(还记得VC6的255个字符长度警告吗?)

在这种情况下,符号表中没有新条目,因此很可能符号表中的查找失败。有趣的是,看看进行th名称查找的上下文是否会影响结果。例如,如果将代码更改为

typedef SObjDict<RWCString, SIDataSource> SObjDict_RWCString_SIDataSource;
m_phDSAttributes = new SObjDict_RWCString_SIDataSource(&RWCString::hash);
typedef SObjDict SObjDict_RWCString_SIDataSource;
m_phDSAttributes=new SObjDict_RWCString_SIDataSource(&RWCString::hash);

这将强制创建另一个符号表条目,用于
SObjDict\u RWCString\u SIDataSource
。该条目是指向模板实例化的某种符号链接。新名称可以(而且必须)自行查找。

致命错误C1001:编译器中发生内部错误。 1> (编译器文件'f:\dd\vctools\compiler\utc\src\p2\p2symtab.c

当我尝试将VS2005代码构建到VS2008时,我也观察到了相同的错误。但直到我没有安装VS2008的Service pack时,这种错误才会发生


您是否安装了Service pack…我认为这将解决您的问题….

我觉得对我自己的问题给出答案并接受它有点不好,但我想这是正确的做法…我解决了我的问题,至少暂时解决了。诀窍似乎是禁用预编译头。我不知道这解决了问题的原因,并且这是非常不幸的,因为我为受影响的项目构建的时间已从不到30秒变为近5分钟,但至少我可以向前推进…如果有人提出一个更持久的解决方案,我将非常乐意将他们的答案标记为已接受。

你向Microsoft投诉了吗?错误在编译器中,即使您的代码有问题,因此您有权这样做。无论如何,他们的编译器团队可能最清楚问题所在。@David:在查看了其他类似于我们的错误报告后,我们还没有向MS发送错误报告(在p2symtab.c文件中显然有很多错误),他们会立即拒绝任何不附带复制脚本的错误报告。我试图将错误简化为简单的复制脚本的尝试失败了。我没有考虑函数指针的问题。我只是注意到有两个函数名为hash()在RWCString内部。一个是静态的,另一个是成员函数。但是它们有不同的签名…有没有什么方法可以让我手动消除它们的歧义,这样我就可以确保不会让编译器绊倒?如果你可以控制RWCString,那么显然要更改名称,如果不创建一个具有两个类似函数的虚拟类,只是为了如果这是你的问题,我希望你可以用函数指针来消除歧义(函数指针毕竟有签名),如果不包装RWCString类,并且有一个名为hash2的静态成员函数调用原始的静态函数…虽然不是很优雅,但肯定会达到目的。我尝试实现了你的建议,但没有改变结果。这真的太糟糕了,因为你的想法似乎是合理的。我安装了service pack 1,它是据我所知的最新版本。虽然从技术上讲,ICE是构建具有未定义行为的程序的合法结果,但它不是一个普遍接受的结果。根据定义,内部编译器错误始终是编译器错误。UB通常会在运行时被诊断或造成严重破坏(或默默地“工作”).99%的ICE是由UB引起的说法是错误的。
typedef SObjDict<RWCString, SIDataSource> SObjDict_RWCString_SIDataSource;
m_phDSAttributes = new SObjDict_RWCString_SIDataSource(&RWCString::hash);