转换这隐含使用用户定义的转换操作符

问题描述:

比方说,我有以下代码:转换这隐含使用用户定义的转换操作符

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

BarBaseBar派生自用户定义的转换运算符Base*。为什么this得到隐含转换为Base*使用上述转换算子?

+0

@Piotr Skotnicki你为什么删除C++ 14标签?问题在于C++ 14,它是目前我使用的编译器支持的最新标准。 – tambre

+1

因为这里的问题与C++ 14功能无关。 – songyuanyao

+0

@songyuanyao在这种情况下,我想知道为什么它是C++ 14标准修订版本的方式,这是我开发的标准版本。在C++ 03或其他一些C++标准版本中可能略有不同。总是善于表达。 – tambre

您已经正确定义了隐式转换运算符,但它不适用于指向您的对象的指针,仅适用于引用。更改您的代码

Foo* foo = new Foo(*this); 

这是不可能的,因为转换经营者必须是非静态成员函数,因此仅适用于引用来定义的隐式转换操作符的指针类型。