【问题标题】:How to repair "invalid operands of types 'const char' to binary 'operator+'? [duplicate]如何将“类型'const char'的无效操作数修复为二进制'operator +'?[重复]
【发布时间】:2012-09-26 22:32:46
【问题描述】:

可能重复:
How do I concatenate multiple C++ strings on one line?

根据this,一个 C++ std::string 是使用 operator+ 连接的。 那么为什么会有这段代码

using namespace std;
string sql = "create table m_table(" + 
    "path TEXT," +
    "quality REAL," +
    "found INTEGER);"; 

导致这个错误?

“const char [22]”和“const char [17]”类型的无效操作数 二进制'运算符+'

【问题讨论】:

  • 那些不是您要连接的 C++ 字符串对象,而是 C 字符串。字符串文字是 C 字符串。

标签: c++ concatenation std


【解决方案1】:

克里斯说的,但在这种特殊情况下你可以做

string sql = "create table m_table("
    "path TEXT,"
    "quality REAL,"
    "found INTEGER);"; 

这将在编译时连接字符串

【讨论】:

  • 是的。这适用于我将在这种情况下使用的一组 const 字符串,但我可能还需要 Chris 对 insert into m_table 案例所说的内容,它有变量,我没有提及。
  • @jacknad,只要那些变量是std::strings,你就可以做string s = "abc" "def" + otherString + "ghi";之类的事情
  • 好久没接触C++了。在 C、Java、C#、Vala、Python 等之间,我头晕目眩。但每个人都有自己的魅力。
  • 是的,+ 考虑参数化查询。
  • c++ 最有魅力! ;-)
【解决方案2】:

您需要将其显式转换为字符串以匹配参数列表:

string sql = std::string("create table m_table(") + 
"path TEXT," +
"quality REAL," +
"found INTEGER);"; 

现在第一个是与const char[N] 匹配的字符串,它匹配operator+ 重载之一并返回一个新的std::string,用于重复其余的过程。

【讨论】:

  • +1 但请参阅我对这种情况的评论。
  • 原谅我的无知,但你能做到std::string sql = /* String literals */吗?
  • @MichaelKrelin-hacker,是的,非常好。通常情况下,有一个 char * 变量作为前两个参数之一,在这种情况下,您需要显式转换一个,但这不适用于此处。
  • @chris,是的,这就是为什么我说 对于这种情况。特别是对于sql,我更喜欢参数化查询;)
  • @jacknad,我真的会考虑接受迈克尔的回答。它比这更适用于您的情况,因为它们都是文字。
【解决方案3】:

更好的方法是使用 std::ostringstream

#include <sstream>

const std::string myFunc(const std::string& s1, const std::string& s2)
{
  std::ostringstream os;
  os<<s1<<" "<<s2;
  return os.str();
}

优点是您也可以使用 std::ostream

【讨论】:

  • 如何“更好”地投入 heckuvalotta 资源?
  • 能够将其他类型组合成一个字符串很有用,但我认为没有必要更改简单的字符串连接来获得它。我认为坚持使用 operator+ 并仅使用 std::to_string() 或类似功能是更好的方法:"hello" + std::to_string(50)。 lexical_cast 甚至可以让您对任何具有 ostream operator&lt;&lt;: "Hello, " + boost::lexical_cast&lt;std::string&gt;(myFoo) 的类型执行此操作
  • Michael,如果您需要连接的不仅仅是字符串和/或(通过使用 std::wostringstream)需要处理宽字符字符串等,那会更好。STL 中的 stringstream 类是专门为这些提供的用例类型,扩展 iostreams 范式。格式化、精度、宽度等的 std::ostream 语义也可以在这里发挥作用。
  • @mohaps:好吧,我会避免使用讨厌的实现定义的宽字符;最好不要使用便携式程序。
  • @MatthieuM。但愿如此! :) 但是在一个足够大的代码库和令人讨厌的小遗留第三方库中......最好提前计划并考虑到可怕的 wchar_t 东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 2014-07-19
  • 2020-06-23
  • 2023-03-21
相关资源
最近更新 更多