尝试从MSVC6切换到MSVC 2008时,我一直遇到内部编译错误。经过大量工作注释掉程序的不同部分后,我将错误跟踪到两个不同CPP文件中的两行代码。这两个CPP文件都编译成功,但不知何故会影响错误是否在其他文件中显示。
这两行都涉及实例化几个复杂的嵌套模板。它们似乎也是应用程序中唯一使用抽象类作为模板参数之一的地方。也就是说,我很难确定问题涉及抽象类或模板,这只是我注意到的最明显的事情。我甚至不能确定这些线条是否重要。不过这是他们的样子:
m_phDSAttributes = new SObjDict<RWCString, SIDataSource>(&RWCString::hash);
所以我们有了SObjDict,一个模板化的字典类,SIDataSource,一个抽象接口,参数是一个指向RWCString的静态成员函数的指针。
我一直在玩一些代码,我偶尔会得到错误从一个CPP文件转移到另一个CPP文件(例如,我将一堆模板声明从使用class
更改为{{ 1}}),但我找不到任何押韵或理由。
我对如何进一步调试此问题感到茫然。编译器输出的确切错误(我的源文件名称已更改)如下所示。在互联网上任何地方都没有提到它。我非常渴望有关如何继续的任何建议。我不希望有人说“哦,你只需要做XYZ”,但是如何调试这类问题的指针将不胜感激。
typename
答案 0 :(得分:2)
我觉得有点不好回答我自己的问题并接受它,但我想这是正确的做法......我解决了我的问题,至少是暂时的。诀窍似乎是禁用预编译头。我不知道为什么解决了这个问题,而且非常不幸,因为受影响项目的构建时间从不到30秒变为近5分钟,但至少我可以向前发展..如果有人想出一个更持久的解决方案,我会非常乐意将他们的答案标记为已接受。
答案 1 :(得分:1)
假设p2symtab.c
是符号表代码(的一部分)是合理的选择。这将立即解释升级是如何造成的;此代码已被重写。 (还记得VC6的255个字符长度警告吗?)
在这种情况下,符号表中没有新条目,因此很可能在符号表中查找失败的情况。看看名称查找发生的上下文是否会影响结果会很有趣。例如,如果将代码更改为
会发生什么typedef SObjDict<RWCString, SIDataSource> SObjDict_RWCString_SIDataSource;
m_phDSAttributes = new SObjDict_RWCString_SIDataSource(&RWCString::hash);
这将强制为SObjDict_RWCString_SIDataSource
创建另一个符号表条目。此条目是模板实例化的符号链接。新名称可以(并且必须)单独查找。
答案 2 :(得分: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;
}
原则仍然存在,删除/替换复杂元素,直到您有编译的代码,并且您将知道导致问题的原因。
答案 3 :(得分:0)
致命错误C1001:编译器中发生内部错误。 1&gt;(编译文件'f:\ dd \ vctools \ compiler \ utc \ src \ p2 \ p2symtab.c
当我尝试将我的vs 2005代码构建到vs 2008时,我也发现了同样的错误。但是直到我没有安装VS 2008的Service Pack就发生了......
你安装了Service Pack ......我想这会解决你的问题......
答案 4 :(得分:-1)
这通常发生在模板实例化中。不幸的是,它可能是由许多事情引起的,但99%的情况下你的代码巧妙地调用了未定义的行为。