7

Я столкнулся с очень странным симптомом. Кто может сказать мне, в чем причина?Почему компилятор VC++ 2010 сбой при компиляции простого кода?

My VC++ версия компилятора является последним: "Microsoft Visual C++ 2010: 01019-532-2002102-70860"

Шаги для воспроизведения:

  1. Создание консольного проекта пустой win32
  2. Добавить новый файл cpp с именем main.cpp
  3. Вставьте следующий код в main.cpp
  4. Компиляция
  5. Компилятор аварий и сообщает следующее сообщение:

\ ошибка \ main.cpp (54893757): фатальная ошибка C1001: внутренняя ошибка в компиляторе . (Составитель файл «msc1.cpp», строка 1420)

Чтобы обойти эту проблему, попробуйте упрощение или изменение программы вблизи мест, перечисленных выше. Пожалуйста, выберите команду Техническая поддержка в меню справки Visual C++, или откройте справочную службу технической поддержки файл для получения дополнительной информации. произошло

Эта ошибка в тексте: впрыскиваемого

D: \ ошибка \ main.cpp (63): см ссылка на функции шаблона экземпляра 'XDummy Тест (Т)' быть собран с [ Т = INT ]

Сборка НЕИСПРАВНО.

Ниже приведен исходный код 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; 
} 
+2

Если вы можете уменьшить свой код до минимального кода, который вызывает внутреннюю ошибку компилятора, рассмотрите возможность отправки отчета об ошибке в [Microsoft Connect] (http://connect.microsoft.com/). – 2010-11-27 06:24:26

+0

Использование ключевого слова auto кажется плохим/ленивым. Я не хочу, чтобы выкапывать несколько слоев вызова функций, чтобы узнать, какой тип возвращает функция. И если возвращаемый тип внутренней функции изменится, я предпочел бы получить ошибки компилятора в точке, в которую была вызвана измененная функция, а не на два слоя вверх, задаваясь вопросом, что произошло, и нужно искать причину изменения стука (s) ... Использование auto полезно при определении локальных переменных итератора, но использование его в сигнатурах функций кажется плохой идеей. – 2010-11-27 07:00:25

ответ

5

Вы пробовали любой тип поиска неисправностей самостоятельно?

Я могу воспроизвести сбой с использованием вышеуказанного исходного кода, как вы описали. Конечно, я получаю несколько предупреждений:

  • «IntelliSense: нет экземпляра перегруженной функции„ф“совпадает со списком аргументов»
  • «IntelliSense: слишком мало аргументов в функции вызова»

как со ссылкой на эту строку:

auto v = f(m_Suite); 

еще несколько секунд поиска неисправностей обнаруживает, что закомментировав весь XTest класс, код компилируется и экс без проблем (и, самое главное, без сбоев компилятора). Это говорит мне (и должен сказать вам), что проблема явно лежит где-то в классе XTest.
Вы не можете не задаться вопросом, связано ли это с генерируемыми ошибками компилятора.

Ну, а как насчет того, если мы просто закомментируем эту единственную строку, которая создает ошибки компилятора? Что ты знаешь! Код компилируется и выполняется просто отлично!

Итак, примерно через минуту мы сузили преступника до одной строки кода. Я не собираюсь на самом деле тратить время на то, чтобы точно понять, что делает весь ваш код, так как я думаю, вы можете взять его отсюда сейчас, когда вы точно знаете, где сосредоточить свои усилия. Начните с исправления этих ошибок IntelliSense и посмотрите, не компилируется ли ваш код без сбоев компилятора.

0

Авторы компилятора не ставят очень высокий приоритет в исправление ошибок в своем компиляторе, которые не влияют на способность компилятора генерировать достоверный вывод из допустимого ввода. И среди этих ошибок самый низкий приоритет относится к тем ошибкам, которые не дают тихого вывода недопустимого вывода.

Таким образом, ответ на ваш вопрос заключается в том, что, скорее всего, это либо из-за того, что эта ошибка ранее не сообщалась, либо ей был присвоен очень низкий приоритет.

Смежные вопросы