2012-02-07 6 views
3

私がg ++ 4.1.2を使用して、次のコードをコンパイルすることはできません。参照引数を受け取る基本クラスを作成するにはどうすればよいですか?

#include <memory> 

class A 
{ 
    public: 
}; 

std::auto_ptr<A> GetA() 
{ 
    return std::auto_ptr<A>(new A); 
} 

class B 
{ 
    B(std::auto_ptr<A>& pA) 
    { 
    } 
}; 

class C : public B 
{ 
    C() : B(GetA()) 
    { 
    } 
}; 

私が取得:タイプstd::auto_ptr<A>の右辺値式の

無効なキャストをstd::auto_ptr<A>&

を入力します問題は、初期化リストの中にあるため、変数を定義してその参照を渡すことができないことです。

クラスCの変更のみが許可されている場合、どうすればいいですか?

答えて

3

何かのようにあなたがのみ変更C、あなたができることができる場合:問題はGetAによって返された一時的に非const参照をバインドしようとしている

class C: public B 
{ 
    explicit C(std::auto_ptr<A>& pA) : B(pA) {} 

public: 
    static C *GetC() 
    { 
     std::auto_ptr<A> pA = GetA(); 
     return new C(pA); 
    } 
}; 

。最初に変数に代入することができれば、左辺値があり、うまくいきます。

Alex B によると、は(削除された回答)と言いますが、Bを変更できる場合は、値でauto_ptr引数を取る方が良いでしょう。コンパイラを変更できる場合は、代わりにunique_ptrを使用し、セマンティクスを移動する方がよいでしょう。

+0

ありがとう、それは私のために働いた:-) – user1194529

0

渡された参照でBが何をするかによって異なります。

  • Bは、Bは、引数への参照を保持しようとしているなら、あなたは長いを持って渡されるものは何でも必要なのconst &
  • 議論を行い、その後、引数のコピーを取るために起こっている場合(すでに述べたように、GetA()の呼び出しによって作成された一時的なものはありません)。
関連する問題