字符串初始化失败:"表达式必须具有整数或未整合的枚举类型"

时间:2017-01-13 10:51:11

标签: c++

我有两个不同的样本:

std::string* to_return = new std::string("I love"  + _name + " so much!");

std::string* to_return = new std::string("I love"  + "Martin" + " so much!");

第一个示例说明了在尝试添加另一个名为" _name"的简单字符串对象时的初始化。 在secons示例中,我只连接三个不同的字符串...

尝试制作第二个样本时出现错误:

  

表达式必须具有整数或未整合的枚举类型

5 个答案:

答案 0 :(得分:6)

"I love" + _name + " so much!"评估为std::string,因为该类包含双方+的重载const char*运算符,_namestd::string实例

但编译器不能对+使用任何重载的"I love" + "Martin" + " so much!",因为这些只是const char[]无效的内置+文字,因此编译失败。

然而,

std::string() + "I love" + "Martin" + " so much!"会起作用,就像采用C风格的编译时连接一样:

std::string("I love" "Martin" " so much!");

最后,如果在"love"之后有空格,Martin可能会更加欣赏这条消息。

答案 1 :(得分:2)

"串"不是std::string对象,它只是指向字符(char*)的指针。如果您尝试在指针上使用operator+,通常不会发生任何好事。

要连接几个旧式字符串,最好将其中一个明确地转换为std::string

std::string s = std::string("str") + "ing";

此外,由于c++14您可以使用literal "s"将c样式字符串转换为std::string

auto s = "string"s; // has type std::string and contains data "string"

答案 2 :(得分:1)

字符串文字是const char[(whatever)],C ++中不允许连接const char[(whatever)]

答案 3 :(得分:0)

只要operator +的一个参数是std::string,编译器就会在不使用括号的情况下解决它:

#include <string>

std::string expressAffectionFor(const std::string& name)
{
    auto to_return = "I love"  + name + " so much!";  
    return to_return;
}

name是指向(可能是const)字符的指针时,表达式没有明显的含义。

答案 4 :(得分:0)

字符串"Martin"" so much!"const char*属于_name类型。我认为std::string的类型为+

const char*运算符未针对两个const char*定义,但已为一个std::string和一个const char*定义。

在使用std::string之前,您需要将+个对象中的至少一个转换为+。由于std::string* to_return = new std::string("I love" + "Martin" + std::string(" so much!"));从右到左关联,因此请使用最后一个或第二个但最后一个对象:

author_id = db.Column(db.Integer, db.ForeignKey(Author.__table__.c.id))