C1001: внутренняя ошибка компилятора

Это должно быть самоочевидно. Я пытаюсь реализовать сортировку дистрибутива, и компилятор MSVC сбой. Кажется, это конкретный случай, связанный с моим SFINAE для обнаружения функции-члена, этого не происходит, если я не передаю indexert функции, или если я заменяю has_get_index. Это также не происходит, если я удаляю любую из оставшихся перегрузок индексатора. Проблема остается, если sortable имеет getIndex() const член.

1>test.cpp(34): fatal error C1001: An internal error has occurred in the compiler.
1>  (compiler file 'msc1.cpp', line 1420)
1>   To work around this problem, try simplifying or changing the program near the locations listed above.

(нет "перечисленные выше") минимальный тестовый случай:

#include <vector>
#include <iterator>
#include <type_traits>

#ifndef HAS_MEM_FUNC //SFINAE (or maybe it is?)
#define HAS_MEM_FUNC(name, func)                                        
    template<typename T>                                                
    struct name {                                                       
        typedef char yes[1];                                            
        typedef char no [2];                                            
        template <typename C> static yes& test( typename C::func ) ;    
        template <typename C> static no&  test(...);                    
        static bool const value = sizeof(test<T>(0)) == sizeof(yes);    
    }
#endif
HAS_MEM_FUNC(has_get_index,getIndex);

//default indexer undefined
template <class T>
double indexer(...);
//indexer for objects that have a "T::getIndex() const" member
template <class T>
double indexer(const typename std::enable_if<has_get_index<T>::value,T>::type& b) {
    return b.getIndex();
};

template<class indexert> 
void function(indexert indexeri)
{}

struct sortable {};

int main () {
    function(indexer<sortable>); //line 34
}

1 ответов


Это, вероятно, не то, что вы хотите:

template <typename C> static yes& test( typename C::func ) ;

С typename вы говорите компилятору, что C::func будет тип. На самом деле это будет функция, и размещение имени функции в объявлении параметра не имеет никакого смысла.

возможно, вы намеревались использовать typeof вместо typename?