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.
@skypjack Ok, vì vậy tôi nên bỏ qua 'T' trong, vì chỉ cần xây dựng cho tôi. –
Đó 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
@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ế. –