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ì?
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
@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? –
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