C2440 static_cast无法从基类转换为派生类

弗雷德

我试图理解为什么使用指针从基类强制转换为派生类的编译效果很好,但是使用非指针对象进行强制转换会产生错误C2440。

下面我有一个ThreadedMessage由class继承的基类GPSMessage

struct ThreadedMessage
{
  ThreadedMessage()
    : m_Type(0), m_ID(0)
  { }

  ThreadedMessage(uint Type, uint ID = 0) :
    m_Type(Type), m_ID(ID)
  { }

  uint m_Type;
  uint m_ID;
};    

struct GPSMessage : public ThreadedMessage
{
  GPSMessage()
    : ThreadedMessage()
  { }

  GPSMessage(double lat, double lon)
    : ThreadedMessage(1), m_lat(lat), m_lon(lon)
  { }

  double m_lat;
  double m_lon;
};

myFunction我尝试将基类转换为派生类。

void myFunction(const ThreadedMessage& msg)
{
  const GPSMessage* message = static_cast<const GPSMessage*>(&msg); // Compiles fine
  const GPSMessage message1 = static_cast<const GPSMessage>(msg);   // Error C2440
}

的调用myFunction()如下所示:

GPSMessage msg(21.123, 12.321);
myFunction(msg);

编译时,指针的转换可以正常编译,但非指针的转换失败,并出现以下错误:

错误C2440:“ static_cast”:无法从“ const ThreadedMessage”转换为“ const GPSMessage”没有构造函数可以采用源类型,或者构造函数重载解析度不明确

为什么我不能使用非指针变量将基类转换为派生类?

编译器为MS VS 2008 C ++。

是的,我看过其他类似的SO问题,但我阅读的问题似乎无法回答我的问题。

格扎

这两个角色具有不同的含义。

第一个演员:

const GPSMessage* message = static_cast<const GPSMessage*>(&msg); // Compiles fine

这意味着它msg实际上是一个GPSMessage(或派生的)对象。您要求编译器将其msg作为威胁GPSMessage不会创建新对象,message将指向msg如果msg不是实际GPSMessage(或派生),则此演员表具有未定义的行为。

顺便说一句,以下强制转换具有相同的含义(广播至参考文献):

const GPSMessage& message = static_cast<const GPSMessage&>(msg); // same meaning, which results in a reference instead of a pointer

关于第二个演员:

const GPSMessage message1 = static_cast<const GPSMessage>(msg);   // Error C2440

这意味着您要从创建一个对象您应该提供一种使这种转换成为可能的方法。例如,您应该创建一个具有参数的构造函数:message1msgGPSMessageThreadedMessage

struct GPSMessage {
    GPSMessage(const ThreadedMessage &); // needed constructor
};

或创建一个转换操作符ThreadedMessageGPSMessage

struct ThreadedMessage {
    operator GPSMessage(); // conversion operator
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C2440:“ =”:无法从“ const char [9]”转换为“ char *”

错误 C2440:“=”:无法从“const char *”转换为“LPCWSTR”

decltype错误C2440无法从'int *'转换为'int *&'

错误C2440:“ =”:无法从“ int *”转换为“ int **”

C ++嵌套类模板错误C2440'=':无法从'type'转换为'same type'

错误C2440:“正在初始化”:无法从

C ++错误C2440:“正在初始化”:无法从“类名”转换为“相同的类名”

错误C2440:“正在初始化”:无法从“ CTable”转换为“ CTable”

错误 C2440:“=”:无法从“int”转换为“uint32x4_t”

编译CPython时出错:C2440'函数':无法从'PyObject'转换为PyObject *'

C2440无法从'void(_cdecl *)(int)'转换为'void(_cdecl&)(int)

错误23错误C2440:“返回”:无法从“字符[128]”转换为“字符(&&)[128]”

错误 C2440:“return”:无法从“char *const”转换为“LPCTSTR”

如何解决错误 C2440“正在初始化”:无法从“_Ty”转换为“_Objty”

错误C2440'<函数样式-广播>':无法从'char'转换为'std :: string'

C2440:“正在初始化”:无法从“A<double>”转换为“A<double>”

C ++从具有不同模板编号的派生类转换为基类

在 C# 中将派生类向上转换为基类

动态将派生类类型转换为基类C#

为什么这段代码不将基类转换为c ++中的派生类?

c ++设计:无需额外的数据成员即可从基类转换为派生类

无法在C ++的派生类中重载基类方法

const转发参考给出错误C2440:“正在初始化”:无法从“ const std :: string”转换为“ const std :: string &&”

错误C2440:'正在初始化':无法从'初始化列表'转换为'std :: vector <char *,std :: allocator <_Ty >>'

mex编译错误C2440:“正在初始化”:无法从“ const mwSize *”转换为“ const int32_t *”

基类和派生类C ++

尝试制作自定义字符串类,但我不断收到C2440和E0415错误

错误C2440:“返回”:无法转换。适用于vs140,141,但不适用于vs142

错误C2440和函子