2012-02-07 158 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()创建的临时不)。
相关问题