3

テンプレート クラスと通常のクラス:

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());、それはうまくいきます。したがって、ここにはいくつかのケースがあります:

  1. Holder<Animal> a(Animal()); a.Ref().Print(); // error
  2. Holder<Animal> a = Holder<Animal>(Animal()); a.Ref().Print(); // ok
  3. 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

4

2 に答える 2