VS2017中ostringstream编译报错:表达式必须是左值或函数指示符
问题分析与解决方案
我来帮你搞定这个VS2017的编译错误——你遇到的「表达式必须是左值或函数指示符」错误,确实是&(ostringstream())这部分代码导致的,咱们一步步拆解清楚:
错误根源
ostringstream()创建的是一个匿名临时对象,属于C里的「右值」。根据C标准,&取地址操作要求操作数必须是左值,而右值是不允许被取地址的——因为临时对象的生命周期极短,取它的指针大概率会导致悬空指针、未定义行为,所以VS2017严格执行了这个标准,直接抛出了错误。
你之前的代码试图通过static_cast<ostringstream*>(&(ostringstream() << myTable[1]))绕开限制,但哪怕<<操作返回了流对象,它依然是右值,取地址的操作还是不合法的。
修复方案
这里给你三个实用的修复方式,按需选择:
方案1:使用局部流对象(最直观的修复)
创建命名的局部ostringstream对象,它是左值,完全可以正常调用str()方法:
std::string sErrorInfo= ""; std::string tableName= getTableName(); double* myTable = MaskTableLimit::getFunction().getAddressesByName(tableName); // 定义局部流对象处理转换 std::ostringstream oss1; oss1 << myTable[1]; std::ostringstream oss2; oss2 << myTable[3]; sErrorInfo = tableName + " is not correctly defined. Spectrum limit on the frequency (Fc-" + oss1.str() + ") MHz must be equal to that of the frequency (Fc-" + oss2.str() + ") MHz.";
方案2:用std::to_string简化代码(C++11及以上适用)
如果只是简单的double转string,不需要复杂格式控制,直接用C++11引入的std::to_string更简洁:
std::string sErrorInfo= ""; std::string tableName= getTableName(); double* myTable = MaskTableLimit::getFunction().getAddressesByName(tableName); sErrorInfo = tableName + " is not correctly defined. Spectrum limit on the frequency (Fc-" + std::to_string(myTable[1]) + ") MHz must be equal to that of the frequency (Fc-" + std::to_string(myTable[3]) + ") MHz.";
方案3:封装辅助函数(适合需要格式控制的场景)
如果需要对double的输出格式做定制(比如保留指定小数位、科学计数法),可以封装一个小函数避免重复代码:
#include <iomanip> // 要包含这个头文件使用格式控制符 std::string doubleToString(double val, int precision = 6) { std::ostringstream oss; oss << std::fixed << std::setprecision(precision) << val; // 示例:固定小数位,保留precision位 return oss.str(); } // 调用示例 std::string sErrorInfo= ""; std::string tableName= getTableName(); double* myTable = MaskTableLimit::getFunction().getAddressesByName(tableName); sErrorInfo = tableName + " is not correctly defined. Spectrum limit on the frequency (Fc-" + doubleToString(myTable[1]) + ") MHz must be equal to that of the frequency (Fc-" + doubleToString(myTable[3]) + ") MHz.";
内容的提问来源于stack exchange,提问作者Dinesh
相关产品推荐
相关产品推荐

