2016-09-07 13 views
6

Lấy ví dụ sau đây:g ++ - 6 lỗi trên các thông số mẫu shadowed khi g ++ - 5 không

#include <vector> 

template <typename T, template <class T> class Container> 
std::vector<T> To_Vector(Container<T> const& c){ 
    return std::vector<T>(c.begin(), c.end()); 
} 

int main(){} 

Với g++-5, nó biên dịch không có lỗi:

Với g++-6 đang thất bại trong việc biên dịch :

g++-6 -o main main.cpp 
main.cpp:4:33: error: declaration of template parameter ‘T’ shadows template parameter 
template <typename T, template <class T> class Container> 
           ^~~~~ 
main.cpp:4:11: note: template parameter ‘T’ declared here 
template <typename T, template <class T> class Container> 

Trình biên dịch có sai không? Mã của tôi có sai không?
Tại sao g++-5 biên dịch mã này trong khi g++-6 thì không?


g++-5 --version  
g++-5 (Ubuntu 5.4.1-2ubuntu1~14.04) 5.4.1 20160904 
Copyright (C) 2015 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

g++-6 --version 
g++-6 (Ubuntu 6.2.0-3ubuntu11~14.04) 6.2.0 20160901 
Copyright (C) 2016 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
+0

@skypjack Ok, vì vậy tôi nên bỏ qua 'T' trong , vì chỉ cần xây dựng cho tôi. –

+0

Đó là một giải pháp hợp lệ và hoạt động. Đó là 'T' là vô ích trong ví dụ của bạn, phải không? – skypjack

+0

@skypjack Bạn nói đúng. Tôi phải nhầm lẫn khi nghĩ rằng tên kiểu container phải chuyên về kiểu T, nhưng điều đó xảy ra trên các tham số thực tế. –

Trả lời

4

Hành vi của g ++ 6 là đúng vì theo tiêu chuẩn:

Một mẫu tham số không được redeclared trong phạm vi của nó (bao gồm phạm vi lồng nhau). Mẫu tham số sẽ không có cùng tên với tên mẫu.

Phạm vi T bắt đầu ngay sau khi tuyên bố của nó, vì vậy nó mở rộng vào các tham số mẫu template sau đây, mà redeclares T như một tham số mẫu, do đó nguyên tắc này bị vi phạm.

Tôi tưởng tượng thay đổi giữa g ++ 5 và g ++ 6 là do sửa một số báo cáo lỗi xung quanh vấn đề tương tự.

+0

Tại sao điều này hoạt động thay thế? 'template