编译器发生内部错误

C1001: An internal error has occurred in the compiler

本文关键字:错误 内部 编译器      更新时间:2023-10-16

这应该不言自明。我试图实现一个分布排序,和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
}

这可能不是你想要的:

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

对于typename,您告诉编译器C::func将是一个类型。实际上,它将是一个函数,在形参声明中放置函数名没有任何意义。

您是否打算使用typeof而不是typename ?