2016-06-21 17 views
7

Visual Studio 2015 cập nhật 3 cải tiến hỗ trợ của C++ 11 nhiều, nhưng tôi có vấn đề lạ và tôi đang tìm cách giải quyết.Cập nhật MSVC2015 3 Bản sửa lỗi mẫu variadic

Khi biên dịch mã mẫu có biến thể bằng MSVC cho đối số kiểu mẫu ("kiểu được xác định đầy đủ") đều hoạt động tốt, nhưng nếu tôi muốn sử dụng đối số mẫu mẫu ("loại được xác định một phần"), kết quả sẽ không chính xác.

#include <iostream> 
using namespace std; 

template <template<typename> class... TS> 
struct PARTIAL { 
    static void test(std::ostream& out) 
    { 
     out << "PARTIAL-PROBLEM" << endl; 
    } 
}; 
template <template<typename> class T> 
struct PARTIAL<T>{ 
    static void test(std::ostream& out) 
    {out << "PARTIAL-OK-END" << endl;} 
}; 
template <template<typename> class T, template<typename> class... TS> 
struct PARTIAL<T, TS...>{ 
    static void test(std::ostream& out) 
    { 
     out << "PARTIAL-OK" << endl; 
     PARTIAL<TS...>::test(out); 
    } 
}; 

template <class... TS> 
struct FULL { 
    static void test(std::ostream& out) 
    { 
     out << "FULL-PROBLEM" << endl; 
    } 
}; 
template <class T> 
struct FULL<T>{ 
    static void test(std::ostream& out) 
    {out << "FULL-OK-END" << endl;} 
}; 
template <class T, class... TS> 
struct FULL<T, TS...>{ 
    static void test(std::ostream& out) 
    { 
     out << "FULL-OK" << endl; 
     FULL<TS...>::test(out); 
    } 
}; 
template <typename T> 
struct B{}; 
int main() 
{ 
    FULL<int, int, int>::test(cout); 
    PARTIAL<B, B, B>::test(cout); 
    return 0; 
} 

Kết quả của GCC5.3 (MinGW):

FULL-OK 
FULL-OK 
FULL-OK-END 
PARTIAL-OK 
PARTIAL-OK 
PARTIAL-OK-END 

Kết quả của MSVC:

FULL-OK 
FULL-OK 
FULL-OK-END 
PARTIAL-OK 
PARTIAL-OK 
PARTIAL-OK 
PARTIAL-PROBLEM 

MSVC tạo mã cách khác nhau với nhiều loại định nghĩa đầy đủ và partials. Điều gì sẽ là giải pháp tốt nhất cho việc này?

here is demo that works good on GCC

+2

Trông giống như một lỗi với tôi. – Arunmu

+0

Thay thế '-OK' trong trường hợp chấm dứt bằng' -OK-TERMINATE' để làm cho vấn đề rõ ràng hơn. Ngoài ra, hãy giảm mã của bạn xuống vấn đề: mã hoạt động, theo nghĩa nào đó, không quan tâm. Lưu ý rằng đó không phải là "một phần loại" mà là "tham số mẫu mẫu". – Yakk

+0

Cập nhật, tôi không muốn loại bỏ phần làm việc. Có thể ai đó sẽ tìm giải pháp cho cả hai trường hợp sử dụng – Evgeniy

Trả lời

4

Thêm một tham số cho trường hợp đệ quy sẽ đảm bảo rằng nó không được chọn đối với trường hợp chấm dứt:

template <template<typename> class T, template<typename> class T2, template<typename> class... TS> 
//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
struct PARTIAL<T, T2, TS...>{ 
//    ^^^^ 
    static void test(std::ostream& out) 
    { 
     out << "PARTIAL-OK" << endl; 
     PARTIAL<T2, TS...>::test(out); 
       ^^^^ 
    } 
}; 
+0

Có, điều này hoạt động như mong đợi. Cảm ơn! – Evgeniy

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