テンプレート クラスと通常のクラス:
template <typename Type>
class Holder
{
public:
Holder(const Type& value) : held_(value)
{
cout << "Holder(const Type& value)" << endl;
}
Type& Ref() { return held_; }
private:
Type held_;
};
class Animal
{
public:
Animal(const Animal& rhs) { cout << "Animal(const Animal& rhs)" << endl; }
Animal() { cout << "Animal()" << endl; }
~Animal() { cout << "~Animal" << endl; }
void Print() const { cout << "Animal::Print()" << endl; }
};
Holder<Animal>
次に、このステートメントでインスタンスを作成したいのですがHolder<Animal> a(Animal());
、失敗します。つまりAnimal()
、一時オブジェクトとして扱われません。Holder
そして、このステートメントはのコンストラクターを呼び出しません。
誰かが説明できたら?よくわかりません。a
ここでタイプになると思います。それから、私はそれを使用しますHolder<Animal> a = Holder<Animal>(Animal());
、それはうまくいきます。したがって、ここにはいくつかのケースがあります:
Holder<Animal> a(Animal()); a.Ref().Print(); // error
Holder<Animal> a = Holder<Animal>(Animal()); a.Ref().Print(); // ok
Holder<int> b(4); b.Ref() = 10; cout << b.Ref() << endl; //ok
説明できますか?私は最初の声明と少し混乱しています。そして、このステートメントが引き起こすエラー情報:
GCC4.7.2
:error: request for member 'Ref' in 'a', which is of non-class type 'Holder<Animal>(Animal (*)())'
VS10
: error C2228: left of '.Ref' must have class/struct/union
,error C2228: left of '.Print' must have class/struct/union