2011-08-19 59 views
6

Điều này sẽ tự giải thích. Tôi đang cố gắng để thực hiện một loại phân phối, và trình biên dịch MSVC là crashing. Nó có vẻ là một trường hợp cụ thể để làm với SFINAE của tôi để phát hiện một chức năng thành viên, điều này dường như không xảy ra nếu tôi không vượt qua indexert đến một chức năng, cũng không phải nếu tôi thay thế has_get_index. Nó cũng không xảy ra nếu tôi loại bỏ một trong những quá tải indexer còn lại. Vấn đề vẫn còn nếu sắp xếp có một thành viên getIndex() const.C1001: Đã xảy ra lỗi nội bộ trong trình biên dịch

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. 

(Hiện tại không có "địa điểm nêu trên") Một trường hợp thử nghiệm tối thiểu là:

#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

Hãy thử gửi lỗi tại http://connect.microsoft.com/ –

+0

Hm, không chắc chắn về lỗi của bạn, nhưng [máy in đẹp] (http://louisdx.github.com/cxx-prettyprint/) có đặc điểm SFINAE cho cả hai loại thành viên và chức năng thành viên, bạn có thể xem xét điều đó. –

+0

@Kerrek mã máy in đẹp khẳng định "đặc điểm kiểu SFINAE để phát hiện xem" T :: const_iterator T :: bắt đầu/kết thúc() const "tồn tại", nhưng nó thực sự kiểm tra cho bất kỳ thành viên nào được gọi là "bắt đầu" và "kết thúc". không cụ thể là một chức năng ... Có vẻ như anh chàng đã mã hóa rằng lib đã sao chép một phần một số câu trả lời stackoverflow cùng nhau, mà không hiểu cách chúng hoạt động. –

Trả lời

5

Điều này có lẽ không phải là điều bạn dự định:

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

Với typename bạn nói trình biên dịch C::func sẽ là một loại. Trong thực tế nó sẽ là một hàm, và đặt một tên hàm ở đó trong khai báo tham số không có ý nghĩa gì cả.

Bạn có thể định sử dụng typeof thay vì typename?

+2

Điều đó ngăn cản trình biên dịch bị rơi. Boo Microsoft! –

Các vấn đề liên quan