template2 질문입니다.
글쓴이: nayana / 작성시간: 수, 2004/05/12 - 1:59오후
#include <iostream> #include <cstdlib> using std::cout; using std::endl; using std::cerr; template< typename T > class Stack { int m_size; int m_top; T *m_data; public : explicit Stack( int n = 10 ); ~Stack(); void push( const T &item ); const T& pop(); const T& top() const; bool isEmpty() const { return !( m_top >= 0 ); } bool isFull() const { return !( m_top < m_size ); } }; template< typename T > inline Stack< T >::Stack( int n ) : m_top( -1 ), m_size( n ), m_data( new T[n] ) { } template< typename T > inline Stack< T >::~Stack() { delete []m_data; } template< typename T > void Stack< T >::push( const T& item ) { if ( !isFull() ) m_data[++m_top] = item; else { cerr << "Stack< T >::push():스택 오버플로우" << endl; exit( 1 ); } } template< typename T > inline const T& Stack< T >::pop() { if ( !isEmpty() ) return m_data[m_top--]; else { cerr << "Stack< T >::pop(): 스택 언더프로우" << endl; exit( 1 ); return m_data[m_top]; } } template < typename T > inline const T& Stack< T >::top() const { return m_data[m_top]; } int main ( void ) { const int N = 20; Stack< char* > book( N ); static char *title[N] = { "Standard C++ 정복", "The C++ Programming Language", "The Annotated C++ Reference Manual", "Advanced C++: Programing Styles nad Idioms", "C++ Programming and Fundamental Concepts", "C+C++ Programming With Objects in C and C++", "C++ FAQs", "C++ for C Programmers", "C++ Inside & out", "C++ Tutorial", "" }; static char *author[N] = { "Microsoft", "Eckel", "Ira Pohl", "Marshall P. Cline, Greg A. Lomow", "Allen I. Holub", "Arthur R. Anderson, William J.Heinze", "James 0. Coplien", "Margaret A. Ellis, Bjarne Stroustrup", "Bjarne Stroustrup", "Getfield Ahn", "" }; int i; i = 0; while ( *title[i] ) book.push( title[i++] ); i = 0; while ( !book.isEmpty() ) cout << i << ' ' << author[i++] << ":\n\t" << book.pop() << endl; return 0; }
다음과 같은 warnning 납니다.
tclass1.cpp: In constructor `Stack<T>::Stack(int) [with T = char*]': tclass1.cpp:72: instantiated from here tclass1.cpp:11: warning: member initializers for `int Stack<char*>::m_top' tclass1.cpp:10: warning: and `int Stack<char*>::m_size' tclass1.cpp:32: warning: will be re-ordered to match declaration order
이번에도 원인 모를에러가 문법에 어긋난곳 같은데...다음과 같은 오류가 납니다.
Forums:
[code:1]template< typename T > i
이 부분을
이렇게 하니 에러가 안나네요 ^^
걍 코드만보고 이상이 없어 보여서 실행해 봤습니다.
사실 에러가 안나서 어 내 컴파일러가 더 좋은건가? ^^ 무흣.. 하고 생각했는데,
-Wall 옵션을 주니깐 나는군요 ^^
template< typename T > inline Stack< T >::Stack( int n )
: m_top( -1 ), m_size( n ), m_data( new T[n] )
전 위와 같은 선언이 좀 생소하네요. 역시 C++은 배울게 많습니다 ^^
p.s. 코드를 보아하니 숙제같은데.. 멋지네요 ^^
[code:1]template< typename T > i
에서
로 고치면 됩니다.
constructor에 들어가는 초기화 코드 ( ':' 다음에 쓰는 코드) 에는 값만을 초기화 할 수 있습니다. (함수 같은건 못씁니다.)
[/code]
[code:1]template< typename T > inl
이런식으로 님의 말씀대로 했는데도...똑같은 Warnning 떨어집니다.
그래서 ...윗분 말씀대로
이런식으로 하니까...Warnning 안떨어집니다.
변수조차도 :변수() 이런식으로 못쓰는건지요...
암튼 답변 감사드립니다.^^
초기화 리스트를 쓸 경우에는 변수 선언 순서와 초기화 순서가 일치해야 합
초기화 리스트를 쓸 경우에는 변수 선언 순서와 초기화 순서가 일치해야 합니다. m_size 가 먼저 선언돼 있으니 m_size 부터 초기화하세요.
[code:1]30 template< typename T >
님의 말씀대로 하였더니...잘됍니다..유용한 정보 감사합니다.
다음부터는 순서에 맞추어서..해야겠습니다.
함수도 초기화리스트에 쓸수있더군요!!!
함수를 초기화 리스트에 써도 문제는 없지만,[code:1]new
함수를 초기화 리스트에 써도 문제는 없지만,
new T[n]
와 같은 코드는 문제가 될 소지가 있네요. new가 실패하면 일반적인 방법으로 뒷처리가 불가능하죠.
산넘어 산
댓글 달기