2014-10-17 3 views
-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.5 (7)을 보여주는거야?
내가 명시 적으로 double을 전문으로하고 참조 연산자를 사용하지 않으면 잘 작동합니다.

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

이렇게하면 정확한 출력을 얻을 수 있습니다. 하지만 이렇게하면 오류가 발생합니다.

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

어떻게 해결할 수 있습니까?
어떻게 올바른 출력을 두 번 표시 할 수 있습니까?

+3

왼쪽 값 참조는 오른쪽 값에 바인딩 할 수 없습니다. – chris

+1

또한, 당신은 아무것도 "전문"아니에요. –

+0

OT,하지만'pop' 함수는 실제로'i'를 감소시키지 않습니다. –

답변

3

당신이 사용하는 경우

s3.push(7.50); 

는 사용하는 데 필요한 것 7.5 이후

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

double&로 변환 할 수 없습니다 과부하에 해결 : A와

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

결과에서 잘린 값 7을 얻습니다. 압정.

void push(T &x)으로 전화를 해결하려면 변수를 만들고 통화에서 변수를 사용하십시오.

double x = 7.5; 
s3.push(x); 
+0

@KhairulBasar 인수 타입이'const &'이면, 입력 값은 임시 메모리 위치에서 잘리고 임시 메모리 위치는 함수에 전달됩니다. –

+1

또 다른 가능한 해결책은 'push'가 값 또는 const 참조로 'x'를 취하는 것입니다. –

+0

감사합니다. 하지만 단순히 void push (char & x)를 사용하면 잘 작동하지만 ... 괜찮습니까? 아니면 버그가 생깁니 까? –

1

나는 R Sahu의 답변에 추가하고 싶습니다. C++ 11에서는 r 값 참조이라는 새로운 유형의 참조가 도입되었습니다. R 값 참조는 익명 변수 인 을 참조하는 데 사용됩니다.이 경우 변수는 7.5입니다. R Sahu가 무슨 뜻인지

"7.5double&로 변환 할 수 없습니다"입니다 당신의 double&, 이 당신의 7.5 인 r 값에 바인딩 할 수 없습니다 인 리터 값 참조.

L- 값 참조 T&은 l- 값에만 바인딩 할 수 있습니다. R 값 참조 T&&은 r 값에만 바인딩 할 수 있습니다. 읽기 전용 l 값 참조 const T& 그러나 l- 값 또는 r- 값, 읽기 전용 또는 바인딩 할 수 있습니다. 따라서 함수 오버로드 확인은 읽기 전용 l 값 참조을 사용하기 때문에 push(const char& x)으로 해결됩니다.

읽어 주셔서 감사합니다.

관련 문제