Почему компилятор VC ++ 2010 дает сбой при компиляции простого кода?

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

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

Действия по воспроизведению:

  1. Создайте пустой проект консоли win32
  2. Добавьте новый файл cpp с именем main.cpp
  3. Вставьте следующий код в main. C1001: произошла внутренняя ошибка в компиляторе. (файл компилятора 'msc1.cpp', строка 1420)

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

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

    d: \ bug \ main.cpp (63): см. ссылку на создание экземпляра шаблона функции 'XDummy Test (T)' компилируется с помощью [ T = int]

    Build FAILED.

    Ниже приведен исходный код 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; 
    }
    
8
задан Cody Gray 27 November 2010 в 06:23
поделиться