Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何构造接收引用参数的基类?_C++_Inheritance_G++_Base_Rvalue - Fatal编程技术网

C++ 如何构造接收引用参数的基类?

C++ 如何构造接收引用参数的基类?,c++,inheritance,g++,base,rvalue,C++,Inheritance,G++,Base,Rvalue,我无法使用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

我无法使用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 GetA()
{
返回标准::自动检查ptr(新A);
}
B类
{
B(标准:自动ptr&pA)
{
}
};
丙类:公共乙类
{
C():B(GetA())
{
}
};
我得到:

将类型为
std::auto_ptr
的右值表达式强制转换为类型为
std::auto_ptr&

问题是我无法定义变量并传递其引用,因为我在初始化列表中

当我只能更改class
C
时,我该怎么做呢?

如果你只能更改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);
    }
};
C类:公共B类
{
显式C(std::auto_ptr&pA):B(pA){}
公众:
静态C*GetC()
{
std::auto_ptr pA=GetA();
返回新的C(pA);
}
};
问题是试图将非常量引用绑定到由
GetA
返回的临时引用。如果您可以先将其分配给一个变量,那么您就有了一个左值,并且它可以正常工作


正如Alex B所说(已删除的答案),如果您可以更改B,则最好按值获取
auto_ptr
参数;如果您可以更改编译器,最好使用
unique\u ptr
并移动语义。

取决于B如何处理传入的引用

  • 如果B要复制参数,则将参数设为常量&
  • 如果B将保留对参数的引用,那么您需要传入的任何内容都比B的实例化具有更长的生存期(如前所述,通过调用GetA()创建的临时文件不会)