2013-06-08 3 views
0

я получаю ошибки для кода ниже, когда я пытаюсь скомпилировать, что сказать мне следующее:Проблемы с членством в шаблонах?

  • «IsEmpty»: не является членом «_Stack»

  • Ошибка при компиляции члена шаблона класса недействительный QUEUES функции»:: Епдиеий (константные T &)

    #include <iostream> 
    #include <stack> 
    using namespace std; 
    
    template <class T> 
    class _Stack : public stack<T> { 
    
    public: 
    
        T pop(){ 
         T tmp=stack::top(); 
         stack::pop(); 
         return tmp; 
        } 
    }; 
    
    template <class T> 
    class QueueS { 
    public: 
        QueueS(){} 
    
        bool isEmpty() const{ 
    
        } 
    
    
        void enqueue(const T& el){ 
    
        while (!output.isEmpty()) { 
         input.push(ouput.pop()); 
        } 
    
        input.push(el); 
    
        } 
    
    private: 
    
    _Stack<T> input; 
    _Stack<T> output; 
    
    }; 
    

Я не уверен, что происходит. Может ли кто-нибудь помочь? Я, очевидно, еще не реализовал isEmpty. Интересно, должно ли это иметь эффект.

+4

Одна проблема заключается в том, что ' 'IsEmpty': не является членом«_Stack''. Это не связано с шаблонами. – juanchopanza

+1

Как вы думаете, 'stack :: top()' возвращается? 'top' - это функция-член, и ее следует отменить * экземпляр *' std :: stack'. – 0x499602D2

+1

Не связано с вашей проблемой, но все же: вы не должны использовать идентификаторы, начинающиеся с подчеркивания и прописной буквы (например, '_Stack'). См. [Здесь] (http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier) ​​для связанной должности SO. – jogojapan

ответ

1

Что вы пытаетесь сделать? Это не работает, поскольку isEnpty является функцией-членом класса _stack. Вы можете решить первую проблему, добавив функцию isEmpty в свой класс _Stack.

Как так:

#include <iostream> 
#include <stack> 
using namespace std; 

template <class T> 
class _Stack : public stack<T> 
{ 

public: 

T pop(){ 
T tmp=stack::top(); 
stack::pop(); 
return tmp; 
} 
bool isEmpty() const{ 

return stack::empty(); 
} 
}; 

template <class T> 
class QueueS { 


public: 
QueueS(){} 

bool isEmpty() const{ 

} 


void enqueue(const T& el){ 

while(!output.isEmpty()) { 
input.push(output.pop()); 
} 

input.push(el); 

} 

private: 
_Stack<T> input; 
_Stack<T> output; 

}; 


int main() 
{ 
_Stack<int> sk; 
sk.isEmpty(); 
QueueS<int> qu; 
qu.enqueue(4); 
return 1; 
} 
+0

Я просто пытался использовать его в качестве чека. Поскольку мои стеки являются частными, я собирался попытаться использовать функцию (однажды написанную) как переход между ними для доступа к ним. Однако, поскольку они объявлены в отдельных классах, может быть, мне лучше использовать только проверку библиотеки .empty()? –

+0

Мне все равно нужен экземпляр объекта, чтобы сделать это изменение, не так ли? «Я использую шаблон класса, требующий список аргументов шаблона», и я считаю, что это то, что он говорит. –

+0

Я не совсем уверен, что вы имеете в виду, может быть, если вы добавите свой основной или линию, которая дала вам ошибку. – petric