错误 C2440:'initializing':无法从

error C2440: 'initializing' : cannot convert from

在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

你正在使用 tstringstream,如果定义了 UNICODE,我猜它会使用 std::wstringstream,所以它的 str() 给出 std::basic_string<wchar_t>.

但是你得到的结果是std::string,也就是std::basic_string<char>。所以赋值失败。

无论如何,你把结果用在 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;
}