无法将"std::string {aka std::basic_string<char>}"转换为"char"作为回报
Cannot convert ‘std::string {aka std::basic_string<char>}’ to ‘char’ in return
我在函数外返回字符串时遇到问题。之前有没有应该做的转换?
我在课外使用公共const int val_int[ ]
和const char* val_rom[ ]
。
内部类:
private:
char* roman;
public:
char arab2rzym(int arabic) throw (RzymArabException){
if( arabic < 0){
throw RzymArabException(arabic + " is too small");
}
else if(arabic > 3999){
throw new RzymArabException(arabic + " is too big");
}
std::string roman;
for(int i=12; i>=0; i--){
while(arabic>=val_int[i]){
roman.append(val_int[i]);
arabic-=val_int[i];
}
}
return roman;
}
是否可以将方法的签名更改为:
std::string arab2rzym(int arabic)
如果是这样,您可以在实际需要的地方使用字符串。
无论如何,我建议您研究std::string引用,尤其是运算符[]和方法c_str()
。
从逻辑上讲,字符类似于'a'
或'1'
,而字符串应该是"a11a"
。如果你希望它能起作用,你希望它做什么?"a11a"
对应的字符是什么?那么,一个字符对应一个字符数组?
为了回答这个问题,您会得到错误,因为您无法将字符串转换为字符。如何修复它完全取决于你想要完成什么——很可能你不想返回char
,而是返回string
。
我认为应该将方法的签名更改为:
std::string arab2rzym(int arabic)
此外,您在方法中使用std::string定义隐藏私有char*roman类变量,我不知道这是否是目的?
顺便说一句,在c++中,声明一个方法抛出哪些异常通常不是一个好主意,因为如果您稍后修改代码以抛出不同的异常,而忘记更新"throws"声明,那么它就会调用默认的意外异常处理程序来终止程序。一种约定是在方法定义的末尾编写throws声明,但随后将其注释掉。这样,使用你的方法的人就知道它抛出了什么,但如果你忘记用声明更新定义,你的程序就不会崩溃。
如果您坚持返回char,有两种解决方案可以实现
首先,声明一个私有的std::string变量,并通过c_str 返回它
private :
std::string roman;
char const* arab2rzym(int arabic){
if( arabic < 0){
throw RzymArabException(std::to_string(arabic) + " is too small");
}
else if(arabic > 3999){
throw new RzymArabException(std::to_string(arabic) + " is too big");
}
roman.clear();
for(int i=12; i>=0; i--){
while(arabic>=val_int[i]){
roman.append(val_int[i]);
arabic-=val_int[i];
}
}
return roman.c_str();
}
其次,将roman声明为静态变量
char const* arab2rzym(int arabic){
if( arabic < 0){
throw RzymArabException(std::to_string(arabic) + " is too small");
}
else if(arabic > 3999){
throw new RzymArabException(std::to_string(arabic) + " is too big");
}
static std::string roman;
roman.clear();
for(int i=12; i>=0; i--){
while(arabic>=val_int[i]){
roman.append(val_int[i]);
arabic-=val_int[i];
}
}
return roman.c_str();
}
最后要提的是,我不认为RzymArabException(阿拉伯语+"太大了");可以做你想做的事,你应该在做之前把阿拉伯语转换成字符串
如果您的编译器支持c++11
RzymArabException(std::to_string(arabic) + " is too big");
如果不是
RzymArabException((char)(((int)'0')+arabic) + std::string("is too big"));
更好地使用interpret_cast将其转换为
- 使用char类型将decimal转换为string,将string转换为decimal
- std::string 构造函数如何处理固定大小的 char[]?
- C++:将模板类型 char 转换为 std::string
- 从 std::string 到 std::array<char,size> 的 memcopy 额外数据是否是一种未定义的行为?
- "No suitable conversion function from 'std::string' to 'const char *' exists"
- 将"std::string {aka std::basic_string}"赋值中的不兼容类型<char>
- 错误:为"运算符 std::string {aka std::__cxx11::basic_string}"指定的返回类型<char>
- 为什么std::string没有(显式)const char*强制转换
- 将 std::string 转换为 const char* 用于 printf 消耗
- 我可以使用istream_iterator将<char>一些 istream 内容复制到 std::string 中吗?
- 让 'std::vector<unsigned char>' 从 'std::string' 中窃取内存
- 错误:请求从"Mstream"转换为非标量类型"std::string {aka std::basic_string<char>}"
- C :如何使用char / string 2D数组接受用户的1个以上的源性
- 我们应该在带有 char *func(char *string) 的函数中返回什么?需要简要说明这与 c 中的 char
- C++ 从 char* 到 char 的转换无效 (char* = *string.begin() )
- 无法在循环中读取Char/string
- 当我将char* string赋值给std::string时,可以释放它的内存吗?
- C char string和stint .h uint8_t在嵌入式系统中的兼容性
- 如何在c++中将LPBYTE转换为char */string
- 如何在等待用户输入int, float或其他类型时拒绝输入char/string