-1

我有以下代码:

#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 表示 double 而不是 7.5 ?
当我明确专门针对 double 并且不使用引用运算符时,它运行良好。

void push(double x)
{
    a[i++]=x;
}

这为双精度提供了正确的输出。但是,当我这样做时,它会出错。

void push(T x)
{
    a[i++]=x;
}
void push(const char &x)
{
    a[i++]=x;
}

如何解决这个问题?
如何显示 double 的正确输出?

4

2 回答 2

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);
于 2014-10-17T03:36:31.990 回答
1

我想补充一下 R Sahu 的回答。在 C++11 中,引入了一种新的引用类型,称为r 值引用。R 值引用用于引用未命名的变量,在本例中就是 7.5。

R Sahu 所说的“7.5不能转换为double&”的意思是左值引用,即 your double&不能绑定到 r 值,即 your 7.5

左值引用T&只能绑定到左值。R 值引用T&&只能绑定到 r 值。然而,只读左值引用const T&可以绑定到左值或右值,无论是否为只读。因此,函数重载解析将解析为,push(const char& x)因为它采用只读的左值引用

感谢您的阅读。

于 2014-10-17T03:53:31.453 回答