2008-12-06 33 views
5

Có thể sử dụng khai báo "sử dụng" với các lớp cơ sở mẫu không? Tôi đã đọc nó không phải là here nhưng là vì lý do kỹ thuật hoặc là nó chống lại các tiêu chuẩn C + +, và nó áp dụng cho gcc hoặc trình biên dịch khác? Nếu không thể, tại sao không?Tuyên bố "sử dụng" có thể được sử dụng với các mẫu không?

Ví dụ mã (từ liên kết ở trên):

struct A { 
    template<class T> void f(T); 
}; 

struct B : A { 
    using A::f<int>; 
}; 
+0

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

+0

Jared, tôi đã sửa liên kết. –

+0

Có, xin lỗi, tôi đã sao chép liên kết từ thanh địa chỉ và nó đã sai. – Sydius

Trả lời

4

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); 
} 
+0

Đây là thứ khác. OP có thể có nghĩa là một mẫu hàm thành viên nằm trong lớp cơ sở. –

+0

Xin lỗi, tôi là người mới sử dụng. Có thể gọi foo từ bên trong một phương thức c2 mà không cần phải chỉ định lớp cơ sở, tức là "foo()" thay vì "c1 :: foo()"? – Sydius

+0

Sydius, có bạn làm điều này-> foo(); foo nằm trong baseclass, và cái đó phụ thuộc vào tham số mẫu. tiêu chuẩn cho biết cuộc gọi phải đủ điều kiện hoặc với toán tử phạm vi (c1 :: foo()) hoặc sử dụng this-> foo() ;. nếu không nó giả định "foo" là một hàm toàn cục –

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