2013-08-13 16 views
5

Ich habe eine Klasse-Vorlageteilweise spezialisierte Vorlage Freunde

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

ich die Spezialisierung für N=0 will ein Freund von einer anderen Klasse zu sein, aber ich weiß nicht, die Syntax für sie (und ich kann ihn nicht finden aus mir selbst). Ich habe versucht:

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

    /* ... */ 
}; 

ich für jede Art will G Foo< G, 0 > ein Freund von class Bar<T> zu sein. Was ist die korrekte Syntax dafür?

Vielen Dank!

Antwort

2

In C++ 03 ist das nicht möglich; der C++ Standard 14.5.3/9 sagt der folgende:

Friend declarations shall not declare partial specializations.

Wie in einer anderen Antwort erwähnt, gibt es einige Abhilfen für dieses Problem sein kann, aber die spezifische Funktionalität für Sie in diesem Standard fragen nicht verfügbar. Zum Glück

, C 11 ++ ist recht gut heute unterstützt und mit der Fähigkeit, Template-Aliase angeben, können wir erreichen ihn nur:

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

Dies kompiliert mit gcc, doch irgendwie Klirren Version 3.8 kompilieren. Die Fehlermeldung ist 'error: Neudefinition von 'X_partial' als andere Art von Symbol Vorlage Freund Klasse X_partial;' . – ScootyPuff

1

Ohne C 11 ++ ich glaube, das Beste, was Sie tun können, ist ein gefälschtes Typ alias, die einen Code (Konstruktor) duplicatation (was nicht lösen kann das eigentliche Problem Sie versuchen) können verlangen:

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

Hinweis: 'Vorlage Freund Klasse FooAlias;' => das 'G 'ist hier nicht notwendig. –

Verwandte Themen