Error: invalid operands of types ‘const char [35]’ and ‘const char [2]’ to binary ‘operator+’

后端 未结 6 512
野性不改
野性不改 2020-11-28 20:36

At the top of my file I have

#define AGE \"42\"

Later in the file I use ID multiple times including some lines that look like



        
相关标签:
6条回答
  • 2020-11-28 20:57

    I had the same problem in my code. I was concatenating a string to create a string. Below is the part of code.

    int scannerId = 1;
    std:strring testValue;
    strInXml = std::string(std::string("<inArgs>" \
                            "<scannerID>" + scannerId) + std::string("</scannerID>" \
                            "<cmdArgs>" \
                            "<arg-string>" + testValue) + "</arg-string>" \
                            "<arg-bool>FALSE</arg-bool>" \
                            "<arg-bool>FALSE</arg-bool>" \
                            "</cmdArgs>"\
                            "</inArgs>");
    
    0 讨论(0)
  • 2020-11-28 20:59

    In line 2, there's a std::string involved (name). There are operations defined for char[] + std::string, std::string + char[], etc. "Hello " + name gives a std::string, which is added to " you are ", giving another string, etc.

    In line 3, you're saying

    char[] + char[] + char[]
    

    and you can't just add arrays to each other.

    0 讨论(0)
  • 2020-11-28 21:02

    Consider this:

    std::string str = "Hello " + "world"; // bad!
    

    Both the rhs and the lhs for operator + are char*s. There is no definition of operator + that takes two char*s (in fact, the language doesn't permit you to write one). As a result, on my compiler this produces a "cannot add two pointers" error (yours apparently phrases things in terms of arrays, but it's the same problem).

    Now consider this:

    std::string str = "Hello " + std::string("world"); // ok
    

    There is a definition of operator + that takes a const char* as the lhs and a std::string as the rhs, so now everyone is happy.

    You can extend this to as long a concatenation chain as you like. It can get messy, though. For example:

    std::string str = "Hello " + "there " + std::string("world"); // no good!
    

    This doesn't work because you are trying to + two char*s before the lhs has been converted to std::string. But this is fine:

    std::string str = std::string("Hello ") + "there " + "world"; // ok
    

    Because once you've converted to std::string, you can + as many additional char*s as you want.

    If that's still confusing, it may help to add some brackets to highlight the associativity rules and then replace the variable names with their types:

    ((std::string("Hello ") + "there ") + "world");
    ((string + char*) + char*)
    

    The first step is to call string operator+(string, char*), which is defined in the standard library. Replacing those two operands with their result gives:

    ((string) + char*)
    

    Which is exactly what we just did, and which is still legal. But try the same thing with:

    ((char* + char*) + string)
    

    And you're stuck, because the first operation tries to add two char*s.

    Moral of the story: If you want to be sure a concatenation chain will work, just make sure one of the first two arguments is explicitly of type std::string.

    0 讨论(0)
  • 2020-11-28 21:14

    You cannot concatenate raw strings like this. operator+ only works with two std::string objects or with one std::string and one raw string (on either side of the operation).

    std::string s("...");
    s + s; // OK
    s + "x"; // OK
    "x" + s; // OK
    "x" + "x" // error
    

    The easiest solution is to turn your raw string into a std::string first:

    "Do you feel " + std::string(AGE) + " years old?";
    

    Of course, you should not use a macro in the first place. C++ is not C. Use const or, in C++11 with proper compiler support, constexpr.

    0 讨论(0)
  • 2020-11-28 21:15

    AGE is defined as "42" so the line:

    str += "Do you feel " + AGE + " years old?";
    

    is converted to:

    str += "Do you feel " + "42" + " years old?";
    

    Which isn't valid since "Do you feel " and "42" are both const char[]. To solve this, you can make one a std::string, or just remove the +:

    // 1.
    str += std::string("Do you feel ") + AGE + " years old?";
    
    // 2.
    str += "Do you feel " AGE " years old?";
    
    0 讨论(0)
  • 2020-11-28 21:20

    In this particular case, an even simpler fix would be to just get rid of the "+" all together because AGE is a string literal and what comes before and after are also string literals. You could write line 3 as:

    str += "Do you feel " AGE " years old?";

    This is because most C/C++ compilers will concatenate string literals automatically. The above is equivalent to:

    str += "Do you feel " "42" " years old?";

    which the compiler will convert to:

    str += "Do you feel 42 years old?";

    0 讨论(0)
提交回复
热议问题