2013-08-13 40 views
5

Tôi có một lớp mẫumẫu bạn bè Nhiều chuyên

template< typename G, int N > class Foo { /* ... */ }; 

Tôi muốn chuyên môn hóa cho N=0 trở thành một người bạn của một lớp khác, nhưng tôi không biết cú pháp cho nó (và tôi không thể tìm thấy nó ra bản thân mình). Tôi cố gắng:

template< typename T > 
class Bar { 
    template< typename G > friend class Foo< G, 0 >; 

    /* ... */ 
}; 

Tôi muốn cho bất kỳ loại G Foo< G, 0 > trở thành một người bạn của class Bar<T>. Cú pháp chính xác cho điều này là gì?

Cảm ơn bạn!

Trả lời

2

Trong C++ 03 không thể thực hiện được; tiêu chuẩn C++ 14.5.3/9 nói như sau:

Friend declarations shall not declare partial specializations.

Như đã nêu trong một câu trả lời khác, có thể có một số giải pháp cho vấn đề này, nhưng chức năng cụ thể mà bạn yêu cầu không có sẵn trong tiêu chuẩn đó.

May mắn thay, C++ 11 khá tốt được hỗ trợ hiện nay, và có khả năng để xác định mẫu bí danh, chúng ta có thể đạt được chỉ này:

template <typename, typename> struct X{}; 

template <typename T> 
struct Y 
{ 
    template <typename U> using X_partial = X<T, U>; 
    template <typename> friend class X_partial; 
}; 
+3

này biên dịch với gcc, nhưng thất bại trong việc biên dịch với phiên bản kêu vang 3.8. Thông báo lỗi là 'lỗi: định nghĩa lại 'X_partial' làm loại biểu tượng khác nhau mẫu lớp bạn bè X_partial;' . – ScootyPuff

1

Without C++ 11 Tôi nghĩ rằng tốt nhất bạn có thể làm là một loại bí danh giả, mà có thể yêu cầu một số mã (constructor) duplicatation (có thể không giải quyết được vấn đề thực sự bạn đang cố gắng):

template< typename G, int N > class Foo { /* ... */ }; 

template<typename G> class FooAlias : public Foo<G, 0> { }; 

template< typename T > 
class Bar { 
    template< typename G > friend class FooAlias; 

    /* ... */ 
}; 
+0

Lưu ý: 'template lớp người bạn FooAlias;' => 'G' ở đây là không cần thiết. –