Tôi đang chuyển mã C++ của windows (msvc & intel) sang Linux (g ++). Mã này sử dụng rất nhiều mẫu (tôi thích metaprogramming ;-). Nhưng tôi không thể biên dịch mã này:g ++ mẫu vấn đề
template <class TA>
struct A
{
template <class TAB> struct B;
};
template <class TC>
struct C {};
template <class TD>
struct D
{
template <class TTD> class T {};
};
template<class TA>
template<class TBA>
struct A<TA>::B : C<typename D<TA>::T<TBA> >
{
int foo;
};
g ++ cho tôi biết rằng trong định nghĩa của A :: B, C có đối số mẫu không hợp lệ. Nhưng trên msvc và intel nó hoạt động tốt! Có vấn đề gì ở đây? PS: Rất tiếc, tôi không thể đăng mã gốc vì nó quá phức tạp. Nhưng ví dụ này hầu như giống nhau và cho cùng một lỗi trên g ++. Cảm ơn bạn.
CẬP NHẬT: Tôi đã tìm thấy sự cố trong đối số TBA của T. g ++ không giống như cách sử dụng mẫu thứ hai trong định nghĩa.
I have seen that "mẫu mẫu struct ..." cú pháp trước đây nhưng tôi chưa bao giờ biết nó có ý nghĩa gì hay tại sao nó là cú pháp pháp. Có nghĩa là gì (khi "mẫu" được đề cập hai lần trước một cấu trúc như thế)? –
Dennis
@Dennis: Cần thiết cho định nghĩa mẫu lồng nhau bên ngoài mẫu kèm theo, xem ví dụ: [tại đây] (http://www.comeaucomputing.com/techtalk/templates/#outsidedef). –
TA là đối số mẫu của A và TAB là đối số mẫu của A :: B – f0b0s