2

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

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

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

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

我一直在玩一些代码,偶尔会出现从一个 CPP 文件移动到另一个文件的错误(例如,我将一堆模板声明从 usingclass更改为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)
4

5 回答 5

2

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

于 2009-06-24T15:28:45.840 回答
1

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

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

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

这将强制创建另一个符号表条目,对于SObjDict_RWCString_SIDataSource. 这个条目有点像模板实例化的符号链接。新名称可以(并且必须)自行查找。

于 2009-06-18T11:12:15.443 回答
0

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

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

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

于 2009-06-17T19:54:22.860 回答
0

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

当我尝试将我的 vs 2005 代码构建到 vs 2008 时,我也观察到了同样的错误。但是直到我没有安装 VS 2008 的 Service Pack 时才会发生这种情况......

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

于 2009-06-21T03:23:22.017 回答
-2

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

于 2009-06-17T19:51:09.823 回答