无法将'std :: string {aka std :: basic_string <char>}'转换为'char'作为回报​​</char>

时间:2013-03-31 20:34:33

标签: c++ string append

我遇到了返回字符串外部函数的问题。是否应该在之前进行某种转换?

我在课堂外使用公开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;

    }

4 个答案:

答案 0 :(得分:2)

逻辑上,char类似于'a''1',而字符串则为"a11a"。如果您希望这样做,您期望它做什么?与"a11a"对应的字符是什么?那么,一个字符对应一个字符数组?

要回答这个问题 - 您会收到错误,因为您无法将字符串转换为字符。你如何解决它完全取决于你想要完成的事情 - 很可能你不想返回char,而是string

答案 1 :(得分:2)

您是否可以将方法的签名更改为:

std::string arab2rzym(int arabic)

如果是这样,您可以使用实际需要它的字符串。

无论如何,我建议你研究std::string reference,尤其是operator[]和方法c_str()

答案 2 :(得分:1)

我认为您应该将方法的签名更改为:

std::string arab2rzym(int arabic)

此外,您正在使用方法中的std :: string定义隐藏私有char * roman类变量,我不知道这是否意图?

顺便说一下,声明一个方法抛出的异常在c ++中通常不是一个好主意,好像你以后修改代码抛出一个不同的异常,忘记更新“throws”声明然后它调用默认的意外异常处理程序,终止程序。一种惯例是在方法定义的末尾编写throws声明,然后将其注释掉。这样人们使用你的方法知道它抛出了什么,但如果你忘记用声明更新定义,你的程序就不会失败。

答案 3 :(得分:0)

如果你坚持使用return 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"));

最好使用reinterpret_cast来施展它