2012-04-09 6 views
0

Die Beschreibung kann ziemlich umwerfend sein, so direkt zu mir das Beispiel:Freund von Template-Methode in Template-Klasse, innerhalb einer Template-Klasse

#include <iostream> 
#include <typeinfo> 
using namespace std; 

template<typename T> class fr{ 
    static void privatestuff(){ 
     cout<<"private of "<<typeid(T).name()<<endl; 
    } 
public: 
    template<typename TT> void callsomeone(){ 
     fr<TT>::privatestuff(); 
    } 
    //template<typename TT> friend void fr<TT>::callsomeone<T>(); 
    //template<> template<typename TT> friend void fr<TT>::callsomeone<T>(); 
    //template<typename TT> template<> friend void fr<TT>::callsomeone<T>(); 
    //no other combinations... how to get it? 
}; 

int main(){ 
    fr<bool> obj; 
    obj.callsomeone<int>(); 
} 

Grundsätzlich mag ich fr der Lage sein, fr<int>::privatestuff zu nennen. Aber ich möchte auch nicht mehr als, was benötigt wird, so machen fr<int> Freund von nurfr<bool>::callsomeone<int>, nicht fr<bool>::callsomeone<char> oder andere.

Ich kann auf C++ 11 zählen, wenn das nötig ist.

+1

Gibt es hier eine Frage? – ildjarn

+0

Die Frage ist in einem Kommentar im Code. Was es bedeutet? Keine Ahnung ... – scientiaesthete

+1

Willst du 'callsomeone()' ein Freund von 'fr' sein? – jrok

Antwort

1
template<class x> template<class y> friend void fr<x>::callsomeone(); 

Sie dürfen keine Vorlage Argumente callsomeone passieren, weil Sie eine Funktionsvorlage anfreunden möchten, und nicht eine Spezialisierung davon (in anderen Worten: Sie alle Spezialisierungen davon behilflich zu sein).

+0

Sollte das fd sein ? Und wo passt du hin? – SirGuy

+0

bedeutet das nicht Freundlichkeit zu irgendeinem TT zu erklären? Ich möchte es nur Freund machen, wenn TT = T –

+0

Nein, seine Klassenvorlage heißt fr, nicht fd. Ich habe keine Ahnung, warum er fd in der Freundschaftsdeklaration benutzt hat. –