Betrachten Sie die folgenden Header-Dateien.Wie generiert der Compiler Vorlagenklassendefinitionen?
In meinen Object.h
#ifndef OBJECT_H_
#define OBJECT_H_
#include <iostream>
template <class Policy>
class Object
{
friend Policy;
private:
Policy* p;
int hash;
public:
Object():p(new Policy(this)),hash(0){}
~Object(){delete p;}
void set(){p->setHash();}
void show() const{std::cout<<"hash = "<<hash<<std::endl;}
};
#endif // OBJECT_H_
Dann habe ich zwei Richtlinien, P1 und P2 mit unterschiedlichen Hash-Werten.
In p1.h
#ifndef P1_H_
#define P1_H_
template <class Policy> class Object;
class P1
{
enum {p1 = 1};
Object<P1>* t;
public:
P1(Object<P1>* at):t(at){}
void setHash(){t->hash = p1;}
};
#endif // P1_H_
In p2.h
#ifndef P2_H_
#define P2_H_
template <class Policy> class Object;
class P2
{
enum {p2 = 2};
Object<P2>* t;
public:
P2(Object<P2>* at):t(at){}
//void setHash(){t->hash = p2;} // ** Notice here **
};
#endif // P2_H_
In meinem main.cpp
Ich habe
#include "Object.h"
#include "p1.h"
#include "p2.h"
int main()
{
Object<P1> t1;
t1.set();
t1.show();
Object<P2> t2;
//t2.set();
t2.show();
}
Ergebnis auf OS X:
hash = 1
hash = 0
Beobachtungen:
Es kompiliert und ordnungsgemäß ausgeführt. Beachten Sie, dass die Definition von
Object<P2>
nicht vollständig ist. Da P2 nicht setHash() definiert hat.Wenn ich den Kommentar in meinem Haupt loswerden, wird es einen Fehler melden.
./Object.h:20:8: Fehler: Kein Mitglied namens 'setHash' in
main.cpp 'P2': 12: 6: Anmerkung: in Instanziierung Elementfunktion ‚Objekt :: set 'angefragt hier t2.set();
Fragen
das Objektelement innerhalb P1 oder P2-Klasse halten würde für jeden von ihnen sogar Klassendefinition Compiler generieren, wenn ich in Haupt keine Instanz von
Object<P1>
oderObject<P2
erstellen?Warum
Object<P2>
ist OK? Da die Definition unvollständig ist.
"dann wird es einen Fehler melden" Was ist? – user657267
@ user657267 oben hinzugefügt. – Ling