Я столкнулся с очень странным симптомом. Кто может сказать мне, в чем причина?Почему компилятор VC++ 2010 сбой при компиляции простого кода?
My VC++ версия компилятора является последним: "Microsoft Visual C++ 2010: 01019-532-2002102-70860"
Шаги для воспроизведения:
- Создание консольного проекта пустой win32
- Добавить новый файл cpp с именем main.cpp
- Вставьте следующий код в main.cpp
- Компиляция
- Компилятор аварий и сообщает следующее сообщение:
\ ошибка \ 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;
}
Если вы можете уменьшить свой код до минимального кода, который вызывает внутреннюю ошибку компилятора, рассмотрите возможность отправки отчета об ошибке в [Microsoft Connect] (http://connect.microsoft.com/). – 2010-11-27 06:24:26
Использование ключевого слова auto кажется плохим/ленивым. Я не хочу, чтобы выкапывать несколько слоев вызова функций, чтобы узнать, какой тип возвращает функция. И если возвращаемый тип внутренней функции изменится, я предпочел бы получить ошибки компилятора в точке, в которую была вызвана измененная функция, а не на два слоя вверх, задаваясь вопросом, что произошло, и нужно искать причину изменения стука (s) ... Использование auto полезно при определении локальных переменных итератора, но использование его в сигнатурах функций кажется плохой идеей. – 2010-11-27 07:00:25