我一直在研究一些涉及将ASCII值转换为字符串的问题。
如果我使用此代码,我会以g
的形式输出,这是意料之中的。
using namespace std;
int main()
{
int i=6; vector<string> ans;
string t= "";
t+=i+'a';
ans.push_back(t);
cout<<ans[0];
return 0;
}
但是,如果我这样更改代码:
using namespace std;
int main()
{
int i=6; vector<string> ans;
string t= "";
t=t+i+'a'; // <----
ans.push_back(t);
cout<<ans[0];
return 0;
}
当我尝试编译它时,会显示以下错误:
error: no match for 'operator+' (operand types are 'std::string' {aka 'std::__cxx11::basic_string<char>'} and 'int')
7 | t=t+i+'a';
| ~^~
| | |
| | int
| std::string {aka std::__cxx11::basic_string<char>}
两种代码之间的唯一区别是,在第1种代码中,我使用的是t=I‘a’ ,在秒时,<代码>t=t i“a” 。
有人能告诉我第二段有什么问题吗?
案例2中的问题是,由于运算符的优先级,语句实际上被分组为(或等效于)语句。
//---v---v--------->t is std::string while i is an int
t = (t + i) + 'a'; //equivalent to this due to operator precedence
现在,由于t是一个std::string,i是一个int,因为没有重载的操作符,它接受std::string和int,我们得到了上面提到的错误。
请注意,是一个算术运算符,因此在第一种情况下,字符文字
'a'
在编写i'a'
时被提升为int
。并且由于std::string
具有重载string
1、t=i‘a’
案例
在这里,有两件事很重要。第一
std::string& std::string::operator+=(char ch);
调用,它是类(即,std::basic\u字符串)的非模板成员函数
第二,i‘a’的类型是int。
一切正常,因为
int
类型的参数i'a'
可以用作char
类型的函数参数的参数。
2.
t=t i'a';
大小写
与案例1.相反,这里使用了
运算符
。首先是t i
部分,其中i
是int
类型(有关原因的详细信息,请参阅@anoopRana的回答)。但是opeartor
是一个免费的(非成员)函数模板;请参阅https://en.cppreference.com/w/cpp/string/basic_string/operator+.
编译器尝试实例化此定义:
template<class CharT, class Traits, class Alloc>
std::basic_string<CharT,Traits,Alloc>
operator+( const std::basic_string<CharT,Traits,Alloc>& lhs, CharT rhs );
但不能因为:
根据类型std::string
的第一个参数,CharT
将被推导为char
,
- 根据
int
类型的第二个参数,CharT
将被推导为int
。
因此,会发生对偶冲突。并且,没有其他模板可以实例化。
相同问题的简单演示代码:
template <typename Char>
struct String
{
String& operator+=(Char);
};
template <typename Char>
String<Char> operator+(const String<Char>&, Char);
int main()
{
String<char> s;
s += 2 + 'a';
s = s + 2 + 'a';
}
实时链接:https://godbolt.org/z/MonK1e3bq
我有一个关于带有三元运算符的运算符的小代码: 输出(GCC): 但在这里, 三元运算符返回type和sizeoftype是C中的字节。 那么为什么会给出四个字节的输出呢?
我正在使用python 2.7。win8上的9。当我尝试使用matplotlib绘图时,出现以下错误: 从pylab导入* 绘图([1,2,3,4]) [matplotlib.lines.Line2D对象位于0x0392A9D0] 我尝试了测试代码“python simple_plot.py--verbose help”,出现了以下警告: $HOME=C:\Users\XX matplotlib数
问题内容: 在我的实际项目中,这是我修改后的小程序,偶然发生。 我不知道为什么它给输出 10 吗? 之后,我放了两个零,仍然给出输出10。 然后我将 012 更改 为0123 ,现在输出83? 谁能解释为什么? 问题答案: 比我将012更改为0123,现在输出为83? 因为它被当作八进制基数(8),因为该数字的前导数字为0。因此,它对应的十进制值为10。 012: 0123:
关于泛型类型,这可能是一个愚蠢的问题,但我找不到任何好的解释来解释泛型类型中遵循的命名约定。如果有一个类有两个泛型类型;Java程序员通常这样定义它: 为什么不做一些简单的事情,比如: 我只想问为什么要遵循这样的命名惯例?和背后有什么原因吗?或者这个约定来自其他语言(比如c模板)?
问题内容: 我正在编写一个(貌似)简单明了的SQL代码段,该代码段在确保该列存在之后将其删除。 问题:如果列不存在,代码 内 IF子句抱怨说,它无法找到列!好了, 卫生署 ,这就是为什么它的IF子句中! 所以我的问题是,为什么不应该执行的一段代码会出现错误? 这是代码段: …这是错误: 我正在使用Microsoft SQL Server 2005 Express Edition。 问题答案: IF
问题内容: 情况一: 输出: 2005年7月8日星期五00:00:00 GMT-0700(PST) 案例二: 输出: Thu Jul 07 2005 17:00:00 GMT-0700(PST) 为什么第二次解析不正确? 问题答案: 在第5版规范发布之前,该Date.parse方法完全依赖于实现(除后者返回数字而不是a之外,其他方法new Date(string)等效)。在第5版规范中,添加了该要