2013-08-13 10 views
5

BenKısmen uzman şablon arkadaş

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

Ben N=0 başka bir sınıfın bir dost olmak için uzmanlık istediğiniz bir sınıf şablon var, ama bunun için sözdizimi bilmiyorum (ve bunu bulamadık kendim). Denedim: Ben herhangi bir tür G Foo< G, 0 > için istediğiniz

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

    /* ... */ 
}; 

class Bar<T> arkadaş olmak. Bunun için doğru sözdizimi nedir?

Teşekkür ederiz!

cevap

2

C++ 03'te bu mümkün değildir; Başka bir cevap belirtildiği gibi

Friend declarations shall not declare partial specializations.

, bu soruna yönelik bazı geçici çözümler olabilir, ancak talep ediyorlar belirli işlevler, standartta kullanılamaz: C++ 14.5.3/9 standart aşağıdaki söylüyor. Neyse ki

, C++ 11 oldukça iyi günümüzde desteklenmektedir ve şablon adlar belirleme yeteneği sayesinde, sadece bunu başarabilirsiniz: Ben yapabileceğiniz en iyi düşünmek

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

Bu gcc ile derler, ama clang sürümü 3.8 ile derlenmeyecektir. Hata mesajı: Hata: 'X_partial' ifadesininşablon şablon sınıfı X_partial; . – ScootyPuff

1

11 C++ olmadan (Eğer çalışıyorsanız gerçek sorunu çözmek olmayabilir) bazı kod (kurucu) duplicatation gerektirebilir sahte tip diğer addır:

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

Not: 'template arkadaş sınıfı FooAlias;' => 'G' burada gereksizdir. –