转换这隐含使用用户定义的转换操作符
问题描述:
比方说,我有以下代码:转换这隐含使用用户定义的转换操作符
class Base
{
};
class Foo
{
public:
Foo(Base* base)
{
}
};
class BarBase
{
public:
operator Base*()
{
return base;
}
private:
Base* base;
};
class Bar : public BarBase
{
public:
Bar()
{
Foo* foo = new Foo(this);
}
};
代码失败,出现以下错误汇编关于GCC 6.3:
prog.cpp: In constructor ‘Bar::Bar()’:
prog.cpp:30:26: error: no matching function for call to ‘Foo::Foo(Bar*)’
Foo* foo = new Foo(this);
^
BarBase
那Bar
派生自用户定义的转换运算符Base*
。为什么this
得到隐含转换为Base*
使用上述转换算子?
答
您已经正确定义了隐式转换运算符,但它不适用于指向您的对象的指针,仅适用于引用。更改您的代码
Foo* foo = new Foo(*this);
这是不可能的,因为转换经营者必须是非静态成员函数,因此仅适用于引用来定义的隐式转换操作符的指针类型。
@Piotr Skotnicki你为什么删除C++ 14标签?问题在于C++ 14,它是目前我使用的编译器支持的最新标准。 – tambre
因为这里的问题与C++ 14功能无关。 – songyuanyao
@songyuanyao在这种情况下,我想知道为什么它是C++ 14标准修订版本的方式,这是我开发的标准版本。在C++ 03或其他一些C++标准版本中可能略有不同。总是善于表达。 – tambre