vs2013 提示无法从void转换为char

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vs2013 提示无法从void转换为char相关的知识,希望对你有一定的参考价值。

Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换
Qt再使用第三方开源库时,由于库的类型基本上都是标准的类型,字符串遇的多的就是Char*类型
在Qt下怎样将QString转char*呢,需要用到QByteArray类,QByteArray类的说明详见Qt帮助文档。
因为char*最后都有一个‘/0’作为结束符,而采用QString::toLatin1()时会在字符串后面加上‘/0’
方法如下:
Qstring str;
char* ch;
QByteArray ba = str.toLatin1();
ch=ba.data();
这样就完成了QString向char*的转化。经测试程序运行时不会出现bug
注意第三行,一定要加上,不可以str.toLatin1().data()这样一部完成,可能会出错。

补充:以上方法当QString里不含中文时,没有问题,但是QString内含有中文时,转换为char*就是乱码,采用如下方法解决:
方法1:
添加GBK编码支持:
#include <QTextCodec>
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
然后改变上面的第三行为:QByteArray ba = str.toLoacl8Bit(); toLoacl8Bit支持中文
方法2:
先将QString转为标准库中的string类型,然后将string转为char*,如下:
std::string str = filename.toStdString();
const char* ch = str.c_str();
参考技术A 是不是你的方法没有返回值

错误 C2440:“static_cast”:无法从“void (__thiscall Visualizza::*)(char [])”转换为“AFX_PMSG”

【中文标题】错误 C2440:“static_cast”:无法从“void (__thiscall Visualizza::*)(char [])”转换为“AFX_PMSG”【英文标题】:error C2440: 'static_cast' : cannot convert from 'void (__thiscall Visualizza::* )(char [])' to 'AFX_PMSG' 【发布时间】:2020-12-01 12:36:07 【问题描述】:

有人可以帮助我吗? 我正在通过 VS 2010 Ultimate 做一个 MFC 应用程序。 附言。我是 C++ 的新手。 此应用程序用于在组合框文件名上打印。

这是 .cpp 文件


BEGIN_MESSAGE_MAP(Visualizza, CDialogEx)
    ON_CBN_SELCHANGE(IDC_COMBO1, &Visualizza::OnCbnSelchangeCombo1)
END_MESSAGE_MAP()


// Visualizza message handlers


void Visualizza::OnCbnSelchangeCombo1(char util[20])

    std::string s = util;
    LPTSTR x = new TCHAR[s.size() + 1];
    stampa.AddString(x);


这是.h文件

#pragma once
#include "afxwin.h"


// Visualizza dialog

class Visualizza : public CDialogEx

    DECLARE_DYNAMIC(Visualizza)

public:
    Visualizza(CWnd* pParent = NULL);   // standard constructor
    virtual ~Visualizza();

// Dialog Data
    enum  IDD = IDD_DIALOG1 ;

protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnCbnSelchangeCombo1(char util[20]);
    CComboBox stampa;
;

【问题讨论】:

在哪一行发现错误? 正确的原型是afx_msg void OnCbnSelchangeCombo1() - 没有参数。如果更改选择将项目添加到组合框中也会非常令人惊讶,因此您可能应该重新考虑您的方法。 这里的错误是 ON_CBN_SELCHANGE(IDC_COMBO1, &Visualizza::OnCbnSelchangeCombo1) @molbdnilo 我该怎么办? 使用具有适当原型的函数。您可能还应该多学习,少猜测。 【参考方案1】:

CComboBox 文档的Remarks 部分解释了注册通知处理程序。尤其需要遵守以下几点:

父函数原型如下:

afx_msg void memberFxn( );

换句话说:您的用户提供的通知处理程序不能接受任何参数。

void Visualizza::OnCbnSelchangeCombo1(char util[20])

需要改成

void Visualizza::OnCbnSelchangeCombo1()

使其与ON_CBN_SELCHANGE(IDC_COMBO1, &amp;Visualizza::OnCbnSelchangeCombo1) 消息映射条目兼容。

【讨论】:

以及如何从组合框中获取新选择的项目? @dia 作为documented,您可以使用GetLBText。如果您对所选索引感兴趣,请致电CComboBox::GetCurSel。

以上是关于vs2013 提示无法从void转换为char的主要内容,如果未能解决你的问题,请参考以下文章

错误 C2440:“static_cast”:无法从“void (__thiscall Visualizza::*)(char [])”转换为“AFX_PMSG”

VS2013 保存项目出错,提示:未能完成操作。不支持此接口

vs2013调试程序无法结束进程怎么办?

VS报错处理

error C2440: “static_cast”: 无法从“void (__thiscall CMainFrame::* )

Boost buffer_cast 无法从 void* 转换为 PointerToPodType