2017-03-21 15 views
-1

작동하지의 복사 생성자에서 푸시() :팝() 내가 복사 생성자의 원래 스택의 <code>push()</code> 및 <code>pop()</code> 기능을 사용할 그것은 나에게 다음과 같은 오류 줄 때 템플릿 스택 클래스는

[Error] passing 'const Stack' as 'this' argument of 'void Stack::pop() [with type = int]' discards qualifiers [-fpermissive]

어떻게 복사를 푸시와 팝을 사용하여 다른 스택 하나?

template <class type> Stack<type>::Stack(const Stack<type> & originalStk) 
{ 
    MAXSIZE=originalStk.getSize(); 
    list = new type[MAXSIZE]; 
    top = -1; 

    if(!originalStk.isEmpty()) 
    { 
     Stack<type> temp(originalStk.getSize()); 
     while(!originalStk.isEmpty()) 
     { 
      temp.push(originalStk.topVal()); 
      originalStk.pop(); 
     } 
     while(!temp.isEmpty()) 
     { 
      originalStk.push(temp.topVal()); 
      push(temp.topVal()); 
      temp.pop(); 
     } 
    } 
    else 
    { 

    } 
} 
+2

_ "오류가 발생합니다"_ 무슨 오류가 있습니까? 는 [오류] 통과 'const를 스택 이'의 '이'인수로 '무효 스택 :: 팝() [타입 = INT와는]'예선 [-fpermissive] –

+0

@RichardCritten 그것은 나에게 다음과 같은 오류를 제공합니다 'MAXSIZE' 란 무엇입니까? 어쨌든, 그것은 런타임 상수가 아닌 것처럼 보입니다. 즉,'new type [MAXSIZE];는 비표준 확장을 사용합니다. –

+0

를 삭제 : –

답변

0

const Stack<type> & originalStk 스택에 const&이다.

이것은이 참조를 통해 수정하지 않기를 약속 함을 의미합니다.

pop은 스택을 수정합니다. 스택에 const&pop으로 전화하지 마십시오.

template <class type> Stack<type>::Stack(Stack<type>&& originalStk)을 지원하도록 코드를 수정할 수 있습니다.

그러나 poppushtopVal을 사용하여 스택을 변경하지 않고 복사하는 것은 불가능합니다. 더 풍부한 인터페이스를 스택에 사용하여 복사 생성자 (const&)를 작성해야합니다.

유형에 익숙하기 때문에 쉽게 사용할 수 있습니다.

MAXSIZE=originalStk.getSize(); 
list = new type[MAXSIZE]; 
top = -1; 
std::copy(originalStk.list, origialStk.list+MAXSIZE, (type*)list); 
top = originalStk.top; 

이제 new 및 수동 포인터 수명 관리는 code smell입니다. listunique_ptr<type[]>으로 바꾸거나 3 개의 상태 변수를 모두 std::vector<type>으로 바꿉니다.