Tôi có mã biên dịch tốt với VC9 (Microsoft Visual C++ 2008 SP1) nhưng không phải với GCC 4.2 (trên Mac, nếu có vấn đề). Nếu tôi chồng chất đủ điều kiện và từ khóa tôi có thể buộc nó làm việc trong GCC nhưng điều này có vẻ không đúng.Cú pháp C++ tốt hơn cho các typedef và lớp cơ sở mẫu?
Dưới đây là một mẫu mã tối thiểu trưng bày vấn đề của tôi:
template< typename N >
struct B {
typedef N n_type; // can derived class access typedef?
void foo() {} // can derived class access function?
};
template< typename N >
struct D : public B<N> {
typedef B<N> b_type;
typedef typename b_type::n_type bn_type;
void f1(n_type) {} // ERROR: 'n_type' has not been
// declared
void f2(typename B<N>::n_type) {} // OK, verbose
void f3(b_type::n_type) {} // ERROR: 'struct B<N>::n_type' is
// not a type
void f4(typename b_type::n_type) {} // OK, verbose
void f5(bn_type) {} // OK, verbose typedefs
void f6() { foo(); } // ERROR: there are no arguments to
// 'foo' that depend on a template
// parameter, so a declaration of
// 'foo' must be available
void f7() { b_type::foo(); } // OK, verbose
};
Tôi có sai lầm để mong đợi một mẫu lớp có nguồn gốc từ một lớp mẫu để có thể sử dụng typedefs và chức năng thừa hưởng trực tiếp? Có cách nào tốt hơn để làm điều này hơn những gì tôi đã đưa ra cho đến nay?
điểm của 'typedef N n_type' là gì? bạn chỉ có thể sử dụng 'N' trực tiếp – Trent
typedef không được kế thừa, Visual C++ không tuân thủ các tiêu chuẩn thường xuyên. các hàm kế thừa có thể được truy cập bằng cách sử dụng độ phân giải phạm vi, cơ sở IE :: f hoặc this-> f. bạn cũng có thể sử dụng "using base :: f" để đưa hàm vào phạm vi cục bộ. – Anycorn
Nó hoạt động cho tôi ngoại trừ trường hợp của f3. –