我有以下代码:
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
template <class T> class Stack
{
private:
T a[1001];
int i=0,j;
public:
void pop(void)
{
a[i-1]=0.0;
a[i-1]='\0';
}
void push(T &x)
{
a[i++]=x;
}
void push(const char &x)
{
a[i++]=x;
}
void top(void)
{
cout<<a[i-1];
}
};
int main()
{
Stack<char>s1;
s1.push('a');
s1.push('b');
s1.top();
s1.pop();
cout<<"\n";
Stack<int>s2;
s2.push(10);
s2.push(20);
s2.top();
s2.pop();
cout<<"\n";
Stack<double>s3;
s3.push(5.50);
s3.push(7.50);
s3.top();
s3.pop();
cout<<"\n";
return 0;
}
输出:
b
20
7
为什么它显示7为双而不是7.5? 当我明确专注于double并且不使用引用运算符时,它运行良好。
void push(double x)
{
a[i++]=x;
}
这为double提供了正确的输出。 但是,当我这样做时,它会给出错误。
void push(T x)
{
a[i++]=x;
}
void push(const char &x)
{
a[i++]=x;
}
如何解决这个问题? 如何为double显示正确的输出?
答案 0 :(得分:3)
使用时
s3.push(7.50);
它解决了重载
void push(const char &x)
{
a[i++]=x;
}
由于7.5
无法转换为double&
,因此需要使用:
void push(T &x)
{
a[i++]=x;
}
结果,您在堆栈中得到截断值7
。
如果您希望呼叫解析为void push(T &x)
,请创建变量并在呼叫中使用该变量。
double x = 7.5;
s3.push(x);
答案 1 :(得分:1)
我想补充一下R Sahu的回答。在C ++ 11中,引入了一种称为 r值引用的新型引用。 R值引用用于表示未命名的变量,在本例中为7.5。
“7.5
无法转换为double&
”的R Sahu所指的是 l值参考,即double&
,不能绑定到r值,这是您的7.5
。
L值引用T&
只能绑定到l值。 R值引用T&&
只能绑定到r值。 只读 l值引用const T&
但是,可以绑定到l值或r值,只读或不读取。因此,函数重载分辨率将解析为push(const char& x)
,因为它接收只读l值引用。
感谢您的阅读。