【问题标题】:error C2440: 'initializing' : cannot convert from错误 C2440:“正在初始化”:无法从
【发布时间】:2019-01-22 04:39:26
【问题描述】:

在 C++98 中使用 SQLite 时,如何将 stringstream 转换为 Unicode 并将其传递给 sqlite3_exec()?我经常遇到这个错误:

error C2440: 'initializing' : cannot convert from 'std::basic_string<_Elem,_Traits,_Ax>' to 'std::basic_string<_Elem,_Traits,_Ax>'
1>        with"

代码:

int main(int argc, char* argv[]) {
    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;
    char *sql;
    const char* data = "Callback function called";
    tstringstream tstrsSQL;
    tstrsSQL.imbue(std::locale("C"));

    std::string s = tstrsSQL.str(); // converting stringstream to char?
    const char* p = s.c_str();

    /* Open database */
    rc = sqlite3_open("db.db3", &db);

    if( rc ) {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        return(0);
    } else {
        fprintf(stderr, "Opened database successfully\n");
    }

    /* Create SQL statement */
    tstrsSQL << _T("SELECT") something ("FROM") << table;

    /* Execute SQL statement */
    rc = sqlite3_exec(db, p, callback, (void*)data, &zErrMsg); // p needs to be unicode

【问题讨论】:

  • 您需要复制粘贴 fullcomplete 错误输出并显示给我们。另外请指出您在代码中的哪一行显示错误(通过在该行添加注释)。
  • 错误 C2440: 'initializing' : 无法从 'std::basic_string<_elem>' 转换为 'std::basic_string<_elem>' 1> 和 1> [ 1> _Elem=wchar_t, 1> _Traits=std::char_traits, 1> _Ax=std::allocator 1> ] 1> 和 1> [ 1> _Elem=char, 1> _Traits=std ::char_traits, 1> _Ax=std::allocator 1> ] 1> 没有构造函数可以采用源类型,或者构造函数重载决议不明确
  • 如果您使用 Unicode 不要使用字符串或字符,请始终使用 tstring 和 TCHAR。还要定义 UNICODE。也使用 _T("") 代替 "" everywhere。您需要做的就是保持一致。
  • 你真的是指Unicode吗?还是您的意思是宽 C 弦?您可能正在使用 Windows 并将“Unicode”与“UTF-16”混淆,然后将编码与类型混淆。
  • 我已经设置了 tstrsSQL.imbue(std::locale("C"));

标签: c++ sqlite unicode char stringstream


【解决方案1】:

你正在使用tstringstream,如果UNICODE被定义,我猜它使用std::wstringstream,所以它的str()给出std::basic_string&lt;wchar_t&gt;

但是您将结果放入std::string,即std::basic_string&lt;char&gt;。所以分配失败。

不管怎样,你得到结果并在sqlite3_exec() 中使用它,它接受const char* 作为输入。

这就是为什么你不应该使用tstringstream,你应该使用std::stringstream,并从所有字符串文字中删除_T

最小的、完整的、工作的代码:

#include <iostream>
#include <sstream>
using namespace std;

int main()
{
    stringstream strstream;
    strstream << "Hello World";
    string str = strstream.str();
    cout << str << endl;
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    相关资源
    最近更新 更多