2013-05-26 78 views
7

Tôi tìm thấy tính năng kế thừa hàm tạo trong C++ 11 khá hữu ích. Tuy nhiên, tôi thấy cú pháp hơi lạ. Ví dụ bên dưới hoạt động tốt, nhưng tôi không hiểu tại sao tôi cần chỉ định using sysTrajectory::sysTrajectory như trái ngược với using sysTrajectory<Real>::sysTrajectory<Real> khi kế thừa từ một lớp mẫu? Lỗi sau cung cấp lỗi sau: dự kiến ​​‘;’ trước mã thông báo ‘<’ sử dụng sysTrajectory :: sysTrajectory ;. Có thể có bất kỳ vấn đề tiềm năng nào khi kế thừa các hàm tạo từ một mẫu lớp?C++ 11 kế thừa các hàm tạo mẫu

class sysRealTrajectory: public sysTrajectory<Real> 
{ 

    public: 

    /** 
     * Default constructor 
     */ 
     inline sysRealTrajectory(void); 

     using sysTrajectory::sysTrajectory;  

     /** 
     * Default destructor 
     */ 
     inline ~sysRealTrajectory(void); 
}; 

chính:

Real a; 
a=5; 
sysTrajectoryPoint<Real> TP0(1.0,a); 
sysRealTrajectory Trajectory(TP0); 

Trả lời

5

Cú pháp này

using sysTrajectory::sysTrajectory; 

Names tất cả nhà xây dựng của sysTrajectory. Cú pháp này

using sysTrajectory::sysTrajectory<Real>; 

Tên chỉ là một nhà xây dựng mà chấp nhận một mẫu đối số <Real> (có, bạn có thể làm điều đó, bạn có thể vượt qua đối số mẫu rõ ràng để nhà xây dựng trong bối cảnh khai báo). Lớp cơ sở của bạn dường như không có bất kỳ mẫu trình tạo nào, do đó trình phân tích cú pháp của trình biên dịch không lấy sysTrajectory làm tên mẫu và do đó không chấp nhận < làm danh sách đối số mẫu mở. Do đó lỗi cú pháp.

For a template-name to be explicitly qualified by the template arguments, the name must be known to refer to a template.

Thậm chí nếu bạn có mẫu nhà xây dựng, quy tắc sử dụng tuyên bố cũng cấm đó. Nó nói

A using-declaration shall not name a template-id.

+0

Cảm ơn bạn đã giải thích. – user1391279

1

Trong 4.8.1 gcc cú pháp sau làm việc cho tôi:

using sysTrajectory<Real>::sysTrajectory;