gì bạn liên kết đến là một chỉ thị sử dụng. Một tuyên bố sử dụng có thể được sử dụng tốt với các lớp cơ sở templated (chưa nhìn nó trong tiêu chuẩn, nhưng chỉ cần thử nghiệm nó với một trình biên dịch):
template<typename T> struct c1 {
void foo() { std::cout << "empty" << std::endl; }
};
template<typename T> struct c2 : c1<T> {
using c1<T>::foo;
void foo(int) { std::cout << "int" << std::endl; }
};
int main() {
c2<void> c;
c.foo();
c.foo(10);
}
Trình biên dịch một cách chính xác phát hiện các tham số-less foo
chức năng vì khai báo sử dụng của chúng tôi sẽ khai báo lại nó trong phạm vi c2
và xuất kết quả mong đợi.
Chỉnh sửa: đã cập nhật câu hỏi. đây là câu trả lời được cập nhật:
Bài viết phù hợp về việc bạn không được phép sử dụng mẫu-id (tên mẫu và đối số). Nhưng bạn có thể đặt tên mẫu:
struct c1 {
template<int> void foo() { std::cout << "empty" << std::endl; }
};
struct c2 : c1 {
using c1::foo; // using c1::foo<10> is not valid
void foo(int) { std::cout << "int" << std::endl; }
};
int main() {
c2 c;
c.foo<10>();
c.foo(10);
}
Nguồn
2008-12-06 20:15:37
Bạn có thể thêm một chút thông tin cho câu hỏi của mình không? Chính xác những gì bạn nghĩ là bất hợp pháp? Liên kết không đề cập gì về các mẫu – JaredPar
Jared, tôi đã sửa liên kết. –
Có, xin lỗi, tôi đã sao chép liên kết từ thanh địa chỉ và nó đã sai. – Sydius