template2 질문입니다.

nayana의 이미지

#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

이번에도 원인 모를에러가 문법에 어긋난곳 같은데...다음과 같은 오류가 납니다.
seoleda의 이미지

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( int n )
{
    m_top= -1, m_size=n, m_data  = new T[n];
}

이렇게 하니 에러가 안나네요 ^^

걍 코드만보고 이상이 없어 보여서 실행해 봤습니다.

사실 에러가 안나서 어 내 컴파일러가 더 좋은건가? ^^ 무흣.. 하고 생각했는데,

-Wall 옵션을 주니깐 나는군요 ^^

template< typename T > inline Stack< T >::Stack( int n )
: m_top( -1 ), m_size( n ), m_data( new T[n] )

전 위와 같은 선언이 좀 생소하네요. 역시 C++은 배울게 많습니다 ^^

p.s. 코드를 보아하니 숙제같은데.. 멋지네요 ^^

kimsk99의 이미지

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( int n ) 
    : m_top( -1 ), m_size( n )
{ 
    m_data = new T[n];
}

로 고치면 됩니다.

constructor에 들어가는 초기화 코드 ( ':' 다음에 쓰는 코드) 에는 값만을 초기화 할 수 있습니다. (함수 같은건 못씁니다.)
[/code]

nayana의 이미지

template< typename T > inline Stack< T >::Stack( int n ) 
    : m_top( -1 ), m_size( n ) 
{ 
    m_data = new T[n]; 
} 

이런식으로 님의 말씀대로 했는데도...똑같은 Warnning 떨어집니다.
그래서 ...윗분 말씀대로
template< typename T > inline Stack< T >::Stack( int n ) 
{
     m_top = -1 , m_size = n, m_data = new T[n]; 
} 

이런식으로 하니까...Warnning 안떨어집니다.
변수조차도 :변수() 이런식으로 못쓰는건지요...
암튼 답변 감사드립니다.^^
singlet의 이미지

초기화 리스트를 쓸 경우에는 변수 선언 순서와 초기화 순서가 일치해야 합니다. m_size 가 먼저 선언돼 있으니 m_size 부터 초기화하세요.

nayana의 이미지

30  template< typename T > inline Stack< T >::Stack( int n )
  31      : m_size( n ), m_top( -1 ), m_data( new T[n] )
  32  {
  33
  34  }

님의 말씀대로 하였더니...잘됍니다..유용한 정보 감사합니다.
다음부터는 순서에 맞추어서..해야겠습니다.
함수도 초기화리스트에 쓸수있더군요!!!
dudungsil의 이미지

함수를 초기화 리스트에 써도 문제는 없지만,

new T[n]

와 같은 코드는 문제가 될 소지가 있네요. new가 실패하면 일반적인 방법으로 뒷처리가 불가능하죠.

산넘어 산

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.