C++ 正在将std::string转换为const char*,出现错误 #包括 #包括 模板 常量字符*数字字符串(T数字){ std::ostringstream ss; ss d:\programming\euler\problem 4\problem 4\problem 4\source.cpp(8):错误C2039:“c_str”:不是“std::basic_ostringstream”的成员 1> d:\programming\euler\problem 4\problem 4\problem 4\source.cpp(26):请参阅正在编译的函数模板实例化“const char*numberToString(T)”的参考 1> 与 1> [ 1> T=int 1> ]

C++ 正在将std::string转换为const char*,出现错误 #包括 #包括 模板 常量字符*数字字符串(T数字){ std::ostringstream ss; ss d:\programming\euler\problem 4\problem 4\problem 4\source.cpp(8):错误C2039:“c_str”:不是“std::basic_ostringstream”的成员 1> d:\programming\euler\problem 4\problem 4\problem 4\source.cpp(26):请参阅正在编译的函数模板实例化“const char*numberToString(T)”的参考 1> 与 1> [ 1> T=int 1> ],c++,string,types,C++,String,Types,为什么不起作用?c\u str是std::string的成员,而不是ostringstream。如果要从流中获取字符串,请使用str()。但是,请注意,从该字符串返回常量字符*是错误的-在使用常量字符*之前,字符串将超出范围。因此,请让函数返回字符串(或者让它获得一个要写入的缓冲区): 模板 标准::字符串编号字符串(T编号){ std::ostringstream ss; 这是因为c_str()是std::string的成员函数,它返回一个const char* 要获取strinstream的

为什么不起作用?

c\u str
std::string
的成员,而不是
ostringstream
。如果要从流中获取
字符串,请使用
str()
。但是,请注意,从该
字符串返回
常量字符*
是错误的-在使用
常量字符*
之前,
字符串将超出范围。因此,请让函数返回
字符串
(或者让它获得一个要写入的缓冲区):

模板
标准::字符串编号字符串(T编号){
std::ostringstream ss;
这是因为
c_str()
std::string
的成员函数,它返回一个
const char*

要获取strinstream的底层字符串,必须使用

这个错误几乎是不言自明的:

错误C2039:“c_str”:不是“std::basic_ostringstream”的成员

但是请注意,您正在返回一个指向某个对象(由
str()
返回的临时字符串的底层数据)的指针,而该对象在return语句之后(即在调用代码中)将不存在,并且操纵该指针肯定会导致未定义的行为

> C++中,您可以直接返回 STD::String ,并以

输出
template <typename T>
std::string numberToString(T number) {
    std::ostringstream ss;
    ss << number;
    return ss.str();
}
std::cout您要执行的操作:

std::cout << numberToString(123);
有关详细信息,请参阅

取决于somestlstring是什么以及在那里执行的操作

如果它是一个局部变量,则将指针返回到内存中 在GetSomeString完成时被释放,因此它是一个悬空 指针和一个错误

这一切归结为somestlstring和操作的生命周期 您可以对其执行。由.c_str()返回的指针保证 仅在字符串中的下一个变异操作之前有效。如果 在调用.c_str()和s之前,somestlstring发生了一些变化 如果你被建造,你将在未定义的行为领域

但是,您可以简单地使用
std::to_string

printf("%s", numberToString(123).c_str());
std::ostringstream
c_str()
不存在。您的意思是:

std::string s = std::to_string(123);

您已经可以使用它了,因此编写自己的函数是毫无意义的。

文档:您无法获得
const char*
(c_str())从临时字符串返回。从数字字符串返回后,您的
stringstream
将被销毁,其基础
std::string
也将被销毁。当您调用
c_str()
它将返回一个指针,指向仅通过
std::string
生命周期有效的内容。我建议使用
std::string
,因为它是一个对象(不是指针)它将在需要时被复制。仅供参考,标准库提供了此功能,不需要为其编写函数。您阅读了文档,hein?…我这样做了,但现在我的程序没有输出任何内容。有什么问题吗?您为什么需要该
temp
呢?请继续并
返回ss.str()
。或者至少做
temp=ss.str()
。你会白白浪费时间创建
字符串,获取其内部缓冲区并构造另一个
字符串。它不会是指向流内部数据的指针,
str()
返回流中包含的字符串的副本。无论如何,它仍然是指向将在该表达式末尾销毁的临时字符串的指针。@Praetorian Right!更正。如果您没有C++11编译器,并且许多人没有,这并不是毫无意义的。但是,对于有C++11编译器的人来说,这是一个很好的建议编译器。@shawn1874很公平……不过,在这一点上,所有旧的编译器都应该很快淘汰。见鬼,C++14已经进入了最后的批准阶段。
template <typename T>
std::string numberToString(T number) {
    std::ostringstream ss;
    ss << number;
    return ss.str();
}

int main() {
    std::cout << numberToString(123);
    return 0;
}
printf("%s", numberToString(123).c_str());
std::string s = std::to_string(123);
template <typename T>
const char* numberToString(T number) 
{
    std::ostringstream ss;
    ss << number;
    return ss.str().c_str();
}
template <typename T>
std::string numberToString(T number) 
{
    std::ostringstream ss;
    ss << number;
    return ss.str();
}