我尝试了以下内容:
tstringstream s;
s << _T("test") << std::endl;
LPTSTR message = s.str().c_str();
Log(5, _T("Example", message);
其中Log定义如下:
void Log(DWORD dwSeverity, LPTSTR szAppID, LPTSTR szMsgString, ...)
{
}
但是我收到以下错误:
Error: A value of type "const char *" cannot be used to initialize an entity of type "LPTSTR"
但我不确定如何处理这种转换。在我的例子中,我正在使用MSVC ++编译器编译一个多字节字符集应用程序。在这些条件下,LPTSTR被定义为LPSTR,其被定义为CHAR *。
答案 0 :(得分:3)
你正在点击const
- 不兼容。由于某种原因,函数Log
获取指向可变数据的指针,该指针与const
返回的c_str()
数据的指针不兼容。
如果您有选项,请更改Log
以将其参数设为const
(我假设它实际上并未修改传入的字符串):
void Log(DWORD dwSeverity, LPCTSTR szAppID, LPCTSTR szMsgString, ...)
同样,将message
声明为LPCTSTR
。
另请注意,您现在无法按照您现在的方式初始化message
:str()
返回的字符串是临时的,因此您必须存储它:
tstring message = s.str();
Log(5, _T("Example", message.c_str());
如果Log
超出您的控制范围,但您知道 不修改其参数,则可以使用const_cast
:< / p>
LPTSTR message = const_cast<LPTSTR>(message.c_str()); // `message` changed as above
如果您无法保证内部Log
的作用,则必须创建一个可变缓冲区:
std::vector<TCHAR> buffer(message.begin(), message.end());
buffer.push_back(0);
Log(5, _T("Example", &buffer[0]);
答案 1 :(得分:2)
我可以看到一些问题。
首先在这里:
LPTSTR message = s.str().c_str();
对s.str()
的调用会返回一个临时的,除非你保持活着,否则它将被销毁。因此,通过调用c_str()
返回的地址将变为无效。你需要一个临时的本地:
string str = s.str();
LPCTSTR message = str.c_str();
由于c_str()
返回一个const C字符串,你需要将message声明为const C字符串。
另一个问题是你的Log
函数收到一个非const C字符串,但c_str()
返回一个const C字符串。据推测,Log
函数不需要修改消息,所以为什么要求可修改的缓冲区。更改Log
以接收const C字符串:
void Log(..., LPCTSTR szMsgString, ...)
最后,由于这是C ++,你为什么要使用C字符串呢?最好使用C ++字符串。