次のヘッダーファイルを検討してください。私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_
で
は、それから私は、異なるハッシュ値を持つ2つのポリシー、P1とP2を、作成しました。私main.cpp
で
#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_
p2.h
で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_
で
私は、OS X上
#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();
}
結果があります
ハッシュ= 1
ハッシュ= 0
観察:
これは、コンパイルし、適切に実行されます。
Object<P2>
の定義が完全ではないことに注意してください。 P2はsetHash()を定義していないので。私のメインでコメントを取り除くと、エラーが報告されます。
./Object.h:20:8:エラー:12:6:ノート:メンバ関数のインスタンス化の「オブジェクト::セットという名前の 'setHash' 'P2'
main.cppにしていないメンバー'ここで要求されたt2.set();
質問
私がメインで
Object<P1>
またはObject<P2
のインスタンスを作成しない場合でも、それらのそれぞれのクラス定義を生成するコンパイラうP1またはP2クラス内のオブジェクトのメンバーを考えてみましょうか?なぜ
Object<P2>
が問題ありませんか?定義が不完全であるため。
"エラーを報告する"どちらですか?上記に追加された – user657267
@ user657267 – Ling