8

我遇到了一个很奇怪的症状。谁能告诉我根本原因是什么?

我的 VC++ 编译器版本是最新的:“Microsoft Visual C++ 2010 : 01019-532-2002102-70860”

重现步骤:

  1. 创建一个空的win32控制台项目
  2. 添加一个名为 main.cpp 的新 cpp 文件
  3. 将以下代码粘贴到 main.cpp
  4. 编译
  5. 编译器崩溃并报告以下消息:

\bug\main.cpp(54893757):致命错误 C1001:编译器发生内部错误。(编译器文件'msc1.cpp',第 1420 行)

要解决此问题,请尝试在上面列出的位置附近简化或更改程序。请在 Visual C++ 帮助菜单上选择技术支持命令,或打开技术支持帮助文件以获取更多信息。

此错误发生在注入的文本中:

d:\bug\main.cpp(63) : 请参阅使用 [ T=int ] 编译的函数模板实例化 'XDummy Test(T)' 的参考

构建失败。

下面是 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; 
}
4

2 回答 2

5

您自己尝试过任何类型的故障排除吗?

正如您所描述的,我可以使用上述源代码重现崩溃。当然,我收到几个警告:

  • “IntelliSense:没有重载函数“f”的实例与参数列表匹配”
  • “智能感知:函数调用中的参数太少”

都指这一行:

auto v = f(m_Suite); 

再花几秒钟的故障排除发现,通过注释掉整个XTest类,代码可以毫无问题地编译和执行(最重要的是,不会导致编译器崩溃)。这告诉我(并且应该告诉你)问题显然出在XTest课堂上的某个地方。
您不禁想知道这是否与正在生成的编译器错误有关。

那么,如果我们只注释掉产生编译器错误的那一行呢?你知道什么!代码编译并执行得很好!

所以在不到一分钟的时间里,我们将罪魁祸首缩小到了一行代码。不过,我实际上不会花时间去确切地了解您的所有代码的作用,因为我认为您现在可以从这里开始,因为您确切地知道将精力集中在哪里。首先修复这些 IntelliSense 错误,然后查看您的代码是否在编译器不崩溃的情况下编译。

于 2010-11-27T06:20:54.827 回答
-1

编译器作者不会高度重视修复编译器中不影响编译器从有效输入生成有效输出的能力的错误。在这些错误中,最低优先级是那些不会默默产生无效输出的错误。

所以你的问题的答案很可能是因为这个错误以前没有被报告过,或者被分配了一个非常非常低的优先级。

于 2011-08-25T22:52:22.500 回答