如何将tstringstream的内容传递给接收LPTSTR的方法?

时间:2014-03-20 14:13:09

标签: c++ visual-c++ stream type-conversion stringstream

我尝试了以下内容:

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 *。

2 个答案:

答案 0 :(得分:3)

你正在点击const - 不兼容。由于某种原因,函数Log获取指向可变数据的指针,该指针与const返回的c_str()数据的指针不兼容。

如果您有选项,请更改Log以将其参数设为const(我假设它实际上并未修改传入的字符串):

void Log(DWORD dwSeverity, LPCTSTR szAppID, LPCTSTR szMsgString, ...)

同样,将message声明为LPCTSTR

另请注意,您现在无法按照您现在的方式初始化messagestr()返回的字符串是临时的,因此您必须存储它:

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 ++字符串。