尝试从MSVC6切换到MSVC 2008时,我一直遇到内部编译错误。经过大量工作注释掉程序的不同部分后,我将错误跟踪到两个不同CPP文件中的两行代码。这两个CPP文件都编译成功,但不知何故会影响错误是否在其他文件中显示。

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

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

所以我们有了SObjDict,一个模板化的字典类,SIDataSource,一个抽象接口,参数是一个指向RWCString的静态成员函数的指针。

我一直在玩一些代码,我偶尔会得到错误从一个CPP文件转移到另一个CPP文件(例如,我使用 class 更改了一堆模板声明到 typename ),但我找不到任何押韵或理由。

我对如何进一步调试此问题感到茫然。编译器输出的确切错误(我的源文件名称已更改)如下所示。在互联网上任何地方都没有提到它。我非常渴望有关如何继续的任何建议。我不希望有人说“哦,你只需要做XYZ”,但是如何调试这类问题的指针将不胜感激。

1>d:\Dev\webapi.cpp : fatal error C1001: An internal error has occurred in the compiler.
1>(compiler file 'f:\dd\vctools\compiler\utc\src\p2\p2symtab.c', line 5905)
有帮助吗?

解决方案

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

其他提示

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

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

会发生什么
typedef SObjDict<RWCString, SIDataSource> SObjDict_RWCString_SIDataSource;
m_phDSAttributes = new SObjDict_RWCString_SIDataSource(&RWCString::hash);

这将强制为 SObjDict_RWCString_SIDataSource 创建另一个符号表条目。此条目是模板实例化的符号链接。新名称可以(并且必须)单独查找。

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

看起来我向你发送了错误的方向,以下编辑在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;
}

原则仍然存在,删除/替换复杂元素,直到您拥有编译的代码,并且您将知道导致问题的原因。

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

当我尝试将我的vs 2005代码构建到vs 2008时,我也发现了同样的错误。但是直到我没有安装VS 2008的Service Pack就发生了......

你安装了Service Pack ......我想这会解决你的问题......

这通常发生在模板实例化中。不幸的是,它可能是由许多事情引起的,但99%的情况下你的代码巧妙地调用了未定义的行为。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top