2017-07-13 2 views
0

Ich benötige eine Vorlage spezialisierte Klasse, um friend mit einer anderen Vorlage spezialisierten Klasse zu machen.Wie mache ich einen Freund einer teilweise spezialisierten Vorlagenklasse zu einer anderen teilweise spezialisierten Vorlagenklasse?

Beispiel:

template <class A, class B> 
class X { }; 

template <class A, class B> 
class Y { }; 

Jetzt möchte ich nur einige spezifische Spezialisierungen dieser Template-Klassen haben, Freunde zu sein:

I

versucht
template <class A> 
class X <A, bool> { }; 

template <class A> 
class Y <A, bool> 
{ 
    // X<A, bool> shall be friend! 
    template<class _C> using X_partial = X<_C,bool>; 
    template<class _D> friend class X_partial; 

}; 

und dieses,

template <class A> 
class X <A, bool> { }; 

template <class A> 
class Y <A, bool> 
{ 
    // X<A, bool> shall be friend! 
    template<class C> friend class X<class C,bool> 

}; 

Aber beide gibt den Fehler.

Die Syntax kann C++ (03), C++ 11 oder C++ 14 unterstützen.

+0

Klassen sind Vorlage Klasse X {}; –

+0

Zweite Klasse ist Vorlage Klasse y {}; Und ich möchte, wie man Klasse ya Freund der Klasse X macht. –

+4

Bitte werfen Sie einen Blick auf [wie man eine gute Frage stellt] (https://stackoverflow.com/help/how-to-ask) und [mcve] (https : //stackoverflow.com/help/mcve). Fügen Sie den Code von dem, was Sie bisher versucht haben, hinzu und fügen Sie ihn in der Frage hinzu, nicht als Kommentar. – Aconcagua

Antwort

0

Wo ist ein Problem? Was hast du versucht, bevor du diese Frage gestellt hast?

// Templated class X 
template <class A, bool> 
class X { 

}; 

// Templated class Y 
template <class A, bool> 
class Y { 
    // Any specialized A is a friend of any specialized B 
    template <class B, bool> friend class X; 
}; 

Edit: Aktualisierung mit Klassen, die Sie in Kommentar zu Ihrer Frage zur Verfügung gestellt.

+0

Klasse1 ist Vorlage Klasse X {}; Class2 ist Vorlage Klasse y {}; –

+0

Die von Ihnen geschriebene Syntax ist ungültig. Sie können die Klasse mit einem Template-Parameter deklarieren und mit 2 Parametern spezialisieren. –

+0

@AmanGupta Dies sind nicht korrekte Spezialisierungen, muss 'Vorlage Klasse X {};' (eine von True/False!). – Aconcagua

1

Die Friend-Deklaration kann keine Teilspezialisierung deklarieren. Siehe here.

Freundschaftsdeklarationen dürfen keine Teilspezialisierungen deklarieren. [Beispiel:

template<class T> class A { }; 
class X { 
    template<class T> friend class A<T*>;   // error 
}; 

- end Beispiel]

Wenn jedoch die "initial" -Typen für A gleich sind, dann Freundschaft auf die richtige Spezialisierung zu schaffen, ist es wie folgt;

template <class A, class B> 
class Y { }; 

template <class A, class B> 
class X { 
public: 
    // fails to compile when instantiated 
    //X() { Y<A, bool> y; y.i = 42; } 
}; 

template <class A> 
class Y <A, bool> 
{ 
    // partial specialisation provided friendship 
    friend class X<A, bool>; 
    int i = 0; 
}; 

template <class A> 
class X <A, bool> { 
public: 
    X() { Y<A, bool> y; y.i = 42; } 
}; 

int main() 
{ 
    X<int, bool> x1; 
    // fails to compile. 
    X<int, int> x2; 
} 

Sample online.

+0

, warum Sie ein Objekt der Klasse Y in Konstruktor der Klasse X nur

+0

@AmanGupta Demonstration machen zu verdeutlichen, dass es funktioniert ... – Aconcagua

+0

@Aconcagua betreibe ich den Code und es funktioniert nicht ... –

Verwandte Themen