-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

double の代わりに 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 の正しい出力を表示する方法は?

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 値参照は、名前のない変数を参照するために使用されます。この場合は 7.5 です。

R Sahu が「変換できません」が意味するの7.5は、左辺値参照( your ) が右辺値 ( your )にバインドできないことです。double&double&7.5

左辺値参照T&は、左辺値にのみバインドできます。R 値参照は、R 値T&&にのみバインドできます。ただし、読み取り専用の左辺値参照const T&は、左辺値または右辺値 (読み取り専用かどうかに関係なく) にバインドできます。push(const char& x)したがって、関数オーバーロードの解決は、読み取り専用の左辺値参照を受け取るため、に解決されます。

読んでくれてありがとう。

于 2014-10-17T03:53:31.453 に答える