friend + Template-Klasse



  • Hallo zusammen,

    am besten zuerst kurz mein Quellcodeausschnitt und anschließend die Erklärung.

    template
    <
    	int I,
    	int J,
    	int K
    >
    class foo
    {
    	template
    	<
    		int OtherI,
    		int OtherJ
    	>
    	friend class foo<OtherI,OtherJ,K>;
    
    	public:
    		foo()
    		{
    			temp = 5;
    		}
    
    		template
    		<
    			int OtherI,
    			int OtherJ
    		>
    		foo(foo<OtherI, OtherJ, K> const & ref)
    			:temp (ref.temp)
    		{
    		}
    
    	private:
    		int temp;
    };
    

    Es geht um folgende Situation. Die Variable temp soll private deklariert sein und keine getter oder setter Funktionen besitzen. Gleichzeitig soll ein Konstruktur existieren, der ein Objekt der Template-Klasse foo entgegen nimmt, wo die Template-Parameter I,J unterschiedliche Werte gegenüber dem Klassen-Template besitzen kann, aber der Template-Parameter K gleich sein muss.

    Mmmmh, irgendwie mit Worten doof zu beschreiben.

    Der Compiler sagt mir: error: partial specialization 'foo<OtherI, OtherJ, K>' declared 'friend'

    Hilft mir momentan aber nicht weiter.

    Könnt ihr mir einen Tipp geben?

    Viele Grüße
    MM


  • Mod

    Partielle Templatespezialisierungen als friends sind leider verboten. Ich weiß jetzt so aus dem Stand nicht, was der tiefere Grund dafür ist, ist aber so: Ganz spezialisiert oder gar nicht.

    Somit ist auch die Lösung für dein Problem nicht gerade elegant: Mach das ganze template zum friend. Du kannst zusätzlich noch ein paar Compilezeit Assertions in den Konstruktor bauen, um sicherzugehen, dass die Templateparameter die von dir vorgegebenen Rahmenbedingungen erfüllen.


Anmelden zum Antworten