为什么模板类不能正常工作?

时间:2014-10-17 03:30:46

标签: c++ templates template-classes

我有以下代码:

#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显示正确的输出?

2 个答案:

答案 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值引用

感谢您的阅读。