2014-09-19 19 views
10

GCC 4.8.1 chấp nhậnCú pháp tuân thủ chuẩn cho việc thừa kế hàm tạo mẫu là gì?

nhưng MSVC thì không. Mặt khác, MSVC chấp nhận

template <typename T> 
class Subclass : public Baseclass<T> 
{ 
public: 
    using typename Baseclass::Baseclass; 
}; 

nhưng GCC thì không. Sau đó, tôi đã nhìn thấy một loại tuyên bố trong câu hỏi này: c++11 inheriting template constructors

template <typename T> 
class Subclass : public Baseclass<T> 
{ 
public: 
    using typename Baseclass::Baseclass<T>; 
}; 

mà MSVC cảnh báo về một "phong cách lỗi thời tuyên bố" và GCC nói

prog.cpp:8:24: error: ‘template<class T> class Baseclass’ used without template parameters 
     using typename Baseclass::Baseclass<T>; 

Tôi nghĩ ví dụ đầu tiên sẽ là cú pháp tuân thủ chuẩn. Trực giác, có vẻ đúng với tôi.

Cú pháp tuân thủ chuẩn C++ 11 là gì?

+3

Phiên bản MSVC nào? VS2013 không hỗ trợ các nhà thầu kế thừa. AFAIK, cái đầu tiên là cú pháp đúng. 'bằng cách sử dụng Baseclass :: BaseClass ' nên làm việc cho các trường hợp bản thân 'BaseClass' không phải là một mẫu lớp, nhưng có một mẫu hàm tạo. – Praetorian

+0

@Praetorian Bây giờ điều đó thật đáng ngạc nhiên. Nhưng tôi chỉ từng sử dụng hàm khởi tạo mặc định và sao chép, và bây giờ sau khi thử nghiệm một hàm tạo khác, tôi thấy bạn đúng. Các nhà xây dựng bản sao và mặc định có được kế thừa tự động không? –

+1

Bạn sẽ phải kiểm tra tiêu chuẩn, nhưng tôi khá chắc chắn rằng các chức năng thành viên đặc biệt là * không bao giờ * được kế thừa. Chúng có thể được trình biên dịch tự động khai báo trong lớp dẫn xuất theo các quy tắc thông thường cho thế hệ chúng. – Praetorian

Trả lời

2

Câu trả lời được chôn một chút trong tiêu chuẩn. Một tuyên bố sử dụng được định nghĩa là (7.3.3):

using [typename] nested-name-specifier unqualified-id; 

Các nested-name-specifier giải quyết sau khi một số bước vào simple-template-id được định nghĩa là

template-name < [template-argument-list] > 

Tóm lại, phù hợp với cú pháp giữa các ý kiến ​​

template <typename T> 
class Subclass : public Baseclass<T> 
{ 
public: 
    using typename Baseclass<T>::Baseclass; 
}; 
+0

Cảm ơn bạn rất nhiều! –

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