2012-12-17 40 views
5

Xét đoạn mã sau:Hai kết quả khác nhau trên GCC 4.6 và 4.7 cho mẫu template trích

#include <iostream> 
#include <vector> 
#include <array> 
#include <type_traits> 

// Version A 
template<typename T> 
void f(const T& x) 
{ 
    std::cout<<"Version A"<<std::endl; 
} 

// Version B 
template<typename... T1, template<typename...> class T> 
void f(const T<T1...>& x) 
{ 
    std::cout<<"Version B"<<std::endl; 
} 

// Version C 
template<typename T1 = double, typename TN = size_t, template<typename, TN...> class T, TN... N> 
void f(const T<T1, N...>& x) 
{ 
    std::cout<<"Version C"<<std::endl; 
} 

// Main 
int main(int argc, char* argv[]) 
{ 
    f(double()); 
    f(std::vector<double>()); 
    f(std::array<double, 3>()); 
    return 0; 
} 

GCC 4.6.2 trên Windows cho phép:

Version A 
Version B 
Version C 

và GCC 4.7.1 trên Linux cho :

Version A 
Version B 
Version A 

Câu hỏi đặt ra là: TẠI SAO? Đây có phải là lỗi hoặc hành vi không xác định không? Tôi có nên đăng nó lên báo cáo lỗi GCC không?

+2

Chẳng phải đây hỏi trước ngày hôm nay? – Gorpik

+0

Xóa '= size_t' sửa lỗi. – Pubby

+0

@Gorpik: đó là khoảng cùng một mã, nhưng không phải cho cùng một câu hỏi/lý do. – Vincent

Trả lời

4

Dường như lỗi trong gcc 4.7.x (4.7.2 có cùng vấn đề). Dưới đây là một ví dụ đơn giản:

template<int N> struct S {}; 
template<typename T = int, T N> void f(S<N>) {} 
int main() { S<1> s; f(s); } 

gcc 4.7.2 không thành công với:

source.cpp:3:25: error: no matching function for call to 'f(S<1>&)' 
source.cpp:3:25: note: candidate is: 
source.cpp:2:38: note: template<class T, T N> void f(S<N>) 
source.cpp:2:38: note: template argument deduction/substitution failed: 
+1

Bạn có thể báo cáo lỗi này cho GCC không? – Vincent

+2

Tôi đã báo cáo lỗi tại đây: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55724 – Vincent

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