2012-02-07 137 views
3

使用克++ 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,你可以這樣做:

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); 
    } 
}; 

的問題是試圖綁定一個非const引用到臨時由GetA返回。如果你可以先將它分配給一個變量,那麼你有一個左值,它工作正常。

As Alex B said said(刪除答案),如果你可以改變B,最好按auto_ptr這個參數值;如果您可以更改編譯器,則最好使用unique_ptr並改爲移動語義。

+0

謝謝,那對我有用:-) – user1194529 2012-02-07 13:48:59

0

取決於B對傳遞的參考文件做了什麼。

  • 如果B要採取的參數的副本,然後進行論證一個const &
  • 若B將要舉辦的參數的引用,那麼你需要的任何傳遞中有一個較長的(正如已經提到的,通過調用GetA()創建的臨時不)。
相關問題