关于std::stringstream

海上宇航员zach 2016-11-08 11:08:59
FTRESULT
FSUploadManager::Upload(
const char* szServer,
const char* szFileFullName,
int64 nUserID,
const char* szSesssionID,
FS_UPLOAD_CALLBACK pCallBack,
FS_UPLOAD_CALLBACK_EX pCallBack_Ex,
TASKID& nTaskID,
int nConvertType,
int nConvertSize
)
{
FTRESULT fr = FT_OK;
。。。。

std::stringstream ssUserID;
ssUserID << nUserID;
。。。。
}

...全文
729 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
10km 2016-11-21
  • 打赏
  • 举报
回复
补充: 所以将nUserID强制转换为int64_t是不是就可以了?我的环境没有int64这个定义,没办法试是不是能强制转换。
10km 2016-11-21
  • 打赏
  • 举报
回复

std::stringstream的<<操作符是在其父类std::ostream实现的
参见http://www.cplusplus.com/reference/ostream/ostream/operator<</
在std::ostream <<操作符重载函数列表中(C++11版本),有long long参数的版本。
int64不是c++标准定义的类型,不太清楚它具体定义是什么,c++标准中有int64_t(定义在stdint.h),是定义成long long


所以如果将nUserID的类型从int64改为int64_t,则可以编译通过

#include <iostream>
#include <sstream>
using namespace std;
int main() {
int64_t nUserID = 0x887766;
std::stringstream ssUserID;
ssUserID << nUserID;
cout << ssUserID.str() << endl;
return 0;
}





使用-std=c++11选项也一样没问题
16:19:24 **** Rebuild of configuration Debug for project strict_ansi_test ****
Info: Internal Builder is used for build
g++ -std=c++11 -O0 -g3 -Wall -c -fmessage-length=0 -o "src\\strict_ansi_test.o" "..\\src\\strict_ansi_test.cpp"
g++ -o strict_ansi_test.exe "src\\strict_ansi_test.o"

16:19:25 Build Finished (took 1s.233ms)



以上为eclipse+mingw 5.2.0下测试
xskxzr 2016-11-13
  • 打赏
  • 举报
回复
引用 13 楼 qw345 的回复:
[quote=引用 12 楼 zhao4zhong1 的回复:] 乍看起来c++的cin、cout、ifstream、ofstream、istringstream、ostringstream在输入、输出上比c的scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf简单,不用格式控制符! 但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout、ifstream、ofstream、istringstream、ostringstream! 使用scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf。
是的, 目前看来只能先用snprintf来替换了[/quote] 不找出根本原因,其他地方迟早出问题。
jiqiang01234 2016-11-11
  • 打赏
  • 举报
回复
引用 9 楼 ri_aje 的回复:
啥编译器啊,下面的代码 clang 3.8 和 gcc 5.4 都没问题啊。

#include <sstream>
using namespace std;

using int64 = long long;

int main ()
{
 int64 i;
 stringstream ss;
 ss << i;
}
看错误信息,存在自定义 << 重载干扰解析。编译器一般会说候选函数是什么,找找那个在捣乱。
ndk的交叉编译,可能是库实现的问题
jiht594 2016-11-11
  • 打赏
  • 举报
回复
不行就先轉成字符串啊
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
乍看起来c++的cin、cout、ifstream、ofstream、istringstream、ostringstream在输入、输出上比c的scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf简单,不用格式控制符! 但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout、ifstream、ofstream、istringstream、ostringstream! 使用scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf。
是的, 目前看来只能先用snprintf来替换了
赵4老师 2016-11-11
  • 打赏
  • 举报
回复
乍看起来c++的cin、cout、ifstream、ofstream、istringstream、ostringstream在输入、输出上比c的scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf简单,不用格式控制符! 但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout、ifstream、ofstream、istringstream、ostringstream! 使用scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf。
ri_aje 2016-11-10
  • 打赏
  • 举报
回复
啥编译器啊,下面的代码 clang 3.8 和 gcc 5.4 都没问题啊。

#include <sstream>
using namespace std;

using int64 = long long;

int main ()
{
 int64 i;
 stringstream ss;
 ss << i;
}
看错误信息,存在自定义 << 重载干扰解析。编译器一般会说候选函数是什么,找找那个在捣乱。
paschen 版主 2016-11-09
  • 打赏
  • 举报
回复
引用 3 楼 qw345 的回复:
[quote=引用 2 楼 fefe82 的回复:] 把完整的编译输出贴出来?
这个已经是完整的,其他的都是些warning. /Users/zach/AndroidStudioProjects/workingDir/fs_util/libfiletransport/jni/../filetransport/fs/FSUploadManager.cpp:143:14: error: use of overloaded operator '<<' is ambiguous (with operand types 'std::stringstream' (aka 'basic_stringstream<char, char_traits<char>, allocator<char> >') and 'int64' (aka 'long long')) ssUserID << nUserID; ~~~~~~~~ ^ ~~~~~~~ 16 warnings and 1 error generated. make: *** [/Users/zach/AndroidStudioProjects/workingDir/fs_util/libfiletransport/obj/local/armeabi/objs/filetransport/__/filetransport/fs/FSUploadManager.o] Error 1 [/quote] ssUserID << (int64)nUserID; 呢
  • 打赏
  • 举报
回复
引用 7 楼 paschen 的回复:
ssUserID << (int64)nUserID; 呢
这个也不行,另外int64自定义为: typedef long long int64;
  • 打赏
  • 举报
回复
引用 2 楼 fefe82 的回复:
把完整的编译输出贴出来?
这个已经是完整的,其他的都是些warning. /Users/zach/AndroidStudioProjects/workingDir/fs_util/libfiletransport/jni/../filetransport/fs/FSUploadManager.cpp:143:14: error: use of overloaded operator '<<' is ambiguous (with operand types 'std::stringstream' (aka 'basic_stringstream<char, char_traits<char>, allocator<char> >') and 'int64' (aka 'long long')) ssUserID << nUserID; ~~~~~~~~ ^ ~~~~~~~ 16 warnings and 1 error generated. make: *** [/Users/zach/AndroidStudioProjects/workingDir/fs_util/libfiletransport/obj/local/armeabi/objs/filetransport/__/filetransport/fs/FSUploadManager.o] Error 1
fefe82 2016-11-08
  • 打赏
  • 举报
回复
引用 1 楼 qw345 的回复:
一不小心点了提交,补充一下问题。。。。 上面的代码ssUserID << nUserID 处提示编译错误: use of overloaded operator '<<' is ambiguous (with operand types 'std::stringstream' (aka 'basic_stringstream<char, char_traits<char>, allocator<char> >') and 'int64' (aka 'long long')) ssUserID << nUserID; ~~~~~~~~ ^ ~~~~~~~ 使用的是-std=c++11的编译选项,请问在不改变编译选项和int64类型的情况下,这个有修改方法吗?谢谢大家
把完整的编译输出贴出来?
  • 打赏
  • 举报
回复
不过由于其他原因,项目里只能用APP_STL := stlport_static, 这个似乎不支持这种long long 的写法。
  • 打赏
  • 举报
回复
引用 4 楼 jiqiang01234 的回复:
ndk编译吗? 最好用clang,支持的标准一些。 在application.mk里改为 APP_CPPFLAGS := -std=c++11 NDK_TOOLCHAIN_VERSION := clang APP_STL := c++_static
是的,改成c++_static确实能编过
  • 打赏
  • 举报
回复
一不小心点了提交,补充一下问题。。。。 上面的代码ssUserID << nUserID 处提示编译错误: use of overloaded operator '<<' is ambiguous (with operand types 'std::stringstream' (aka 'basic_stringstream<char, char_traits<char>, allocator<char> >') and 'int64' (aka 'long long')) ssUserID << nUserID; ~~~~~~~~ ^ ~~~~~~~ 使用的是-std=c++11的编译选项,请问在不改变编译选项和int64类型的情况下,这个有修改方法吗?谢谢大家
jiqiang01234 2016-11-08
  • 打赏
  • 举报
回复
ndk编译吗? 最好用clang,支持的标准一些。 在application.mk里改为 APP_CPPFLAGS := -std=c++11 NDK_TOOLCHAIN_VERSION := clang APP_STL := c++_static

65,206

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧