Почему происходит сбой компилятора VC ++ 2010 при компиляции простого кода? - PullRequest
8 голосов
/ 27 ноября 2010

Я столкнулся с очень странным симптомом. Кто может сказать мне, в чем причина?

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

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

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

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

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

Эта ошибка произошла во введенном тексте:

d: \ bug \ main.cpp (63): см. Ссылку на создание шаблона функции 'XDummy Test (T)' компилируется с [ T = 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 ]

5 голосов
/ 27 ноября 2010

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

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

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

оба ссылаются на эту строку:

auto v = f(m_Suite); 

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

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

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

0 голосов
/ 26 августа 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...