2

文字列から文字への非推奨の変換についてコンパイラが警告を表示する理由がわかりません。

これは警告について不平を言っている場所です:

私がやっていることのほんの少しの背景..私は例外を理解し、実践しようとしています...ファーストネームなどにchar[1000]を使用する方が良いかどうかはわかりません..誰かが警告を理解し、解決策を見つけるのを手伝ってくれたら本当に感謝しています..ありがとう..

================================================== ===============================

class TeLoEnYuco
{
string FN, LN, R;
    double Income;

public:
    const char *getters(){return FN.data(), LN.data(), R.data();}
    virtual char *getFacilityAccess()=0;
    TeLoEnYuco(char *fn, char *ln, char r, double inc)
    {
        if(fn==0) throw Exception(1, "First Name is Null"); //Warning #1
        if(ln==0) throw Exception(2, "Last Name is Null");  //Warning #2
        if(r==0) throw Exception(3, "Rank is Null");        //Warning #3
        if(inc<=0) throw Exception(4, "Income is Null");    //Warning #4

        FN=fn;
        LN=ln;
        R=r;
        Income=inc;
    }
};

=====================例外クラス========================== ======

class Exception
{
    int Code;
    string Mess;

public:
    Exception(int cd, char *mess)
    {
        Code=cd;
        Mess=mess;
    }
    int getCode(){return Code;}
    const char *getMess(){return Mess.data();}
};
4

1 に答える 1

14

のコンストラクExceptionターの署名は

Exception(int, char*)

実際の型が である文字列リテラルをパラメーターとして渡しますconst char*が、への暗黙的char*な変換は C++11 より前で有効です (ただし非推奨であるため、警告が表示されます)。

署名を次のように変更します

Exception(int, const char*)

または、さらに良いことに、

Exception(int, const std::string&)

要約する:

char* x       = "stringLiteral";  //legal pre-C++11, deprecated
const char* y = "stringLiteral";  // good
std::string z  ("stringLiteral"); // even better
于 2013-07-31T20:15:14.240 に答える