#include <iostream>
#include <sstream>
template <typename T>
const char* numberToString(T number) {
std::ostringstream ss;
ss << number;
return ss.c_str();
}
int main() {
printf(numberToString(123));
return 0;
}
我的错误:
1>d:\programming\euler\problem 4\problem 4\problem 4\source.cpp(8): error C2039: 'c_str' : is not a member of 'std::basic_ostringstream<char,std::char_traits<char>,std::allocator<char>>'
1> d:\programming\euler\problem 4\problem 4\problem 4\source.cpp(26) : see reference to function template instantiation 'const char *numberToString<int>(T)' being compiled
1> with
1> [
1> T=int
1> ]
为什么这不起作用?
答案 0 :(得分:7)
c_str
是std::string
的成员,而不是ostringstream
。如果您想从流中获取string
,请使用str()
。但请注意,从const char*
返回string
是错误的 - string
将超出范围,然后才能使用const char*
。因此,让函数返回string
(或让它获取要写入的缓冲区):
template <typename T>
std::string numberToString(T number) {
std::ostringstream ss;
ss << number;
return ss.str();
}
答案 1 :(得分:4)
c_str()
不存在 std::ostringstream
。你的意思是:
template <typename T>
const char* numberToString(T number)
{
std::ostringstream ss;
ss << number;
return ss.str().c_str();
}
进行更改后,您将遇到另一个问题:您将返回指向刚刚销毁的缓冲区的指针。要解决此问题,您应该返回std::string
:
template <typename T>
std::string numberToString(T number)
{
std::ostringstream ss;
ss << number;
return ss.str();
}
您已经可以使用std::to_string
,因此编写自己的函数毫无意义。
答案 2 :(得分:2)
那是因为c_str()
是std::string
的成员函数,它返回const char*
。
要获取strinstream的基础字符串,必须使用str()
。
错误几乎是自我解释的:
错误C2039:'c_str':不是'std :: basic_ostringstream
的成员
但是请注意,您将返回一个指向某些内容的指针(由str()
返回的临时字符串的基础数据),该指针在返回语句之后(即在调用代码中)不存在并且操纵该指针非常肯定会以未定义的行为结束。
当你在C ++中时,你宁愿直接返回std::string
,并用
std::cout << numberToString(123);
哪个会更安全。
答案 3 :(得分:2)
你想这样做:
template <typename T>
std::string numberToString(T number) {
std::ostringstream ss;
ss << number;
return ss.str();
}
int main() {
std::cout << numberToString(123);
return 0;
}
要获取std::string
中的基础std::ostringstream
,然后获取std::string
中生成的c样式字符串。正如其他人指出的那样,c_str
返回的指针超出范围,因此您必须将其复制到缓冲区或另一个std::string
。如果您坚持使用printf
,请在函数调用中使用c_str
:
printf("%s", numberToString(123).c_str());
有关详细信息,请参阅Is it a good idea to return " const char * " from a function?
取决于somestlstring是什么以及在那里做了什么。
如果是局部变量,则返回指向内存的指针 在GetSomeString完成时正在发布,所以它是一个悬空 指针和错误。
这一切归结为somestlstring和操作的生命周期 你表演它。保证.c_str()返回的指针 仅在字符串中的下一个变异操作有效。因此,如果 某些东西会从调用.c_str()和s之前改变somestlstring 构建你将处于不确定的行为之地。
但是,您只需使用std::to_string
。
std::string s = std::to_string(123);