2009-07-23 10 views
0

der Template-Code ist wie folgt:Wie funktioniert dieser Vorlagencode?

template <class type1> 
struct DefaultInstanceCreator { 
    type1 * operator()() { 
     return new type1; 
    } 
}; 

template < class type1 
, class InstanceCreator = DefaultInstanceCreator<type1> > 
class objectCache 
{ 
    public: 
     objectCache (InstanceCreator & instCreator) 
      :instCreator_ (instCreator) {} 
     type1* Get() { 
      type1 * temp = instCreator_(); 
     } 
    private: 
     InstanceCreator instCreator_; 
}; 

dieser Code funktionieren gut mit Objektklasse wie folgt aus:

class A{ 
public: 
    A(int num){ 
     number = num; 
    } 
    int number; 
    struct CreateInstance { 
     CreateInstance (int value) : value_ (value) {} 
     A * operator()() const{ 
      return new A(value_); 
     } 
     int value_; 
    }; 
}; 
objectCache< A, A::CreateInstance > intcache(A::CreateInstance(2)); 
    A* temp = intcache.Get(); 
    cout << temp->number <<endl; 

, wenn ich diese Vorlage mit Typ wie int, string versucht ...

objectCache<int> intcache(); 
int* temp = intcache.Get(); 
*temp = 3; 
cout <<temp <<endl; 

Ich bekomme E links von "'.Get' muss Klasse/Struktur/Union haben", Ich kann nicht herausfinden, wo das Problem ist

wenn ich

ändern
objectCache<int> intcache; 

ich " 'Objectcache': kein geeigneter Standardkonstruktor verfügbar"

Verwendung

objectCache<int> intcache(DefaultInstanceCreator<int>()); 

I „ '.Get' muss sich gelassen zu bekommen haben class/struct/union "auch.

+0

hinzugefügt Objectcache() {} zu Objectcache-Klasse mit Object < int > intcache funktioniert; jetzt verstehe ich mehr über Vorlage Danke für die Antwort von allen. –

Antwort

7

Hier drin Sie vorbei nicht in den Parametern an den intcache Konstruktor:

objectCache<int> intcache(); 
int* temp = intcache.Get(); 

Dies die erste Zeile führt zu dem bekannten "most vexing parse" von C++, kurz zurückkehren , Sie deklarieren intcache als eine Funktion, die keine Parameter akzeptiert und objectCache<int> zurückgibt. Meinen Sie diese

Vielleicht:

objectCache<int> intcache; 

Aber wahrscheinlich wollte man eine Fabrik weitergeben müssen:

objectCache<int> intcache((DefaultInstanceCreator<int>())); 
+0

In der letzten Zeile haben Sie Klammern um das Konstruktorargument vergessen. Ich habe das korrigiert (komisch - der Fragesteller hatte auch diese Zeile in seiner Frage und fragte sich über den resultierenden Fehler - warum hat er dich nicht gefragt?). Ich möchte auch erwähnen, dass der Konstruktor von 'objectCache' geändert werden müsste, um nicht durch eine nicht-konstante Referenz akzeptiert zu werden, so dass er das temporäre akzeptieren kann. –

1

Sie deklarieren eine Funktion anstelle einer Variablen. Versuchen Sie folgendes:

objectCache<int> intcache; 
1

Erstellen eines Objekts von Object falsch zu sein scheint. Es sollte sein:

objectCache<int> intcache;