2011-07-04 6 views
0

세 개의 파일이 있는데 컴파일하고 실행하려고하지만 오류 및 경고가 계속 나타납니다. 구조체 노드 < T> 재정의. 템플릿에 대해 많이 알지는 못하지만이 템플릿은 나에게 적합합니다. 그리고, 무엇이 잘못되었는지 알아 내려고 많은 시간을 보냈습니다. 감사. 당신이 명부에서 한템플릿에 문제가 있습니다.

//mystack.h 
#ifndef MYSTACK_H 
#define MYSTACK_H 

template <class T> 
struct Node 
{ 
    T info; 
    T *next; 
}; 

template <class T> 
class MyStack 
{ 
private: 
    struct Node<T> *top; 
public: 

    void Push(T item); 

    void Pop(); 

    int Top(); 

    void Print(); 
}; 

#endif 

//mystack.cpp 
#include <iostream> 
#include "mystack.h" 

template <class T> 
struct Node 
{ 
    T info; 
    T* next; 
}; 

template <class T> 
class MyStack 
{ 
private: 
    struct Node<T>* top; 

public: 
    void Push(T item) 
    { 
     if(top == NULL) 
     { 
      top = new(struct Node<T>); 
      top->info = item; 
      top->next = NULL; 
     } else 
     { 
      Node<T>* temp; 
      temp = top; 
      top = new(struct Node<T>); 
      top->info = item; 
      top->next = temp; 
     } 
    } 

    void Pop() 
    { 
     if(top == NULL) 
     { 
     } else 
     {  
      Node<T>* temp; 
      temp = top->next; 
      delete top; 
      top = temp; 
     } 
    } 

    int Top() 
    { 
     return top; 
    } 

    void Print() 
    { 
     if(top != NULL) 
     { 
      Node<T>* temp; 
      temp = top; 
      while(temp != NULL) 
      { 
       std::cout << temp << std::endl; 
       temp = temp->next; 
      } 
     } 
    } 
}; 

답변

0

템플릿 대신 클래스를 디자인하는 경우 형식을 다시 정의하기 때문에 잘못된 작업이 될 수 있습니다.

하지만 템플릿을 작성하기 때문에 이전 버전보다 훨씬 틀리게 템플릿을 별도로 컴파일 할 수 없습니다. 는 C++ 컴파일 모델에 대한

간단한 포인터 : 당신이하고있는로 (서로 다른 TU가 재사용 할 수있는 경우)

// Definition of Node 
template<typename T> 
struct Node { 
    T info; 
    T* next; // shouldn't that be a Node*? 
}; 

// Definition of MyStack 
template <typename T> 
class MyStack 
{ 
private: 
    Node<T> *top; 
public: 

    // Declarations, but not definitions, of the Mystack function members. 
    void Push(T item); 
    void Pop(); 
    int Top(); 
    void Print(); 
}; 

// Example definition of MyStack::Push 
template<typename T> 
void 
MyStack<T>::Push(T item) 
{ 
    // as before 
} 

유형의 정의는 일반적으로 헤더에 표시와 함께 경비를 포함한다. 정의가 TU 당 최대 한 번 나타나야하기 때문에 경비원이 여기에 있습니다. 형식 정의을 수동으로 반복하지 마십시오 (예 : 원본 파일 에서처럼). 아무도 복사 - 붙여 넣기 오류를 원하지 않습니다.

정의은 일반적으로이 템플릿의 구성원이 아닌 경우 소스 파일에 나타납니다. 후자의 경우 헤더에 넣는 것이 더 간단합니다 (인라인 일 필요는 없습니다).

SO, 책 또는 인터넷의 다른 곳에서 편집 모델의 세부 정보를 배울 수 있습니다. '템플릿 정의'또는 '하나의 정의 규칙'(또는 ODR)을 검색하면 도움이됩니다.

2

하나의 실수가 말한대로이 구조를 다시 정의 할 것입니다.

template <class T> 
struct Node 
{ 
    T info; 
    T* next; 
}; 

이 정의는 모두 명부로 수행됩니다

는 정의를 이잖아.

편집 : 두 번째로 클래스 메서드 구현이 올바르게 보이지 않습니다. 템플릿을 사용하는 동안 cpp와 헤더 파일을 분할하지 않으려 고하면 가장 성공할 것입니다.

+0

두 파일 모두에서 구조체를 정의 할 필요가 없습니까? 수업은 어떻습니까? –

+1

모든 포함 된 파일에 한 번만 유형 정의를 사용할 수 있습니다. 클래스 및 다른 유형 정의 코드뿐만 아니라 구조체도 고려합니다. – fyr

0

먼저 헤더에서 'struct Node * top;'줄에서 'struct'를 제거하십시오. C++ 구조체는 클래스와 거의 동일하지만 구조체 멤버는 기본적으로 public이고 클래스 멤버는 기본적으로 private입니다. 직선 C와 같이 struct 키워드를 사용하여 구조체 유형을 선행 할 필요가 없습니다.

둘째, CPP가 모두 잘못되었습니다. 템플릿은 필요할 때 컴파일러에 의해 인스턴스화되므로 일반 (템플릿 전문화 제외)과 같이 객체로 컴파일 될 CPP 파일에 살지 않습니다. 당신은 HPP 자체 또는 더 나은 일반적인 솔루션 IPP의 파일을 사용하는 것입니다 귀하의 템플릿 정의를 넣을 수 있습니다 즉

// mystack.ipp 
#ifndef MYSTACK_IPP 
#define MYSTACK_IPP 

#include "mystack.h" 
#include <iostream> 

template <class T> 
void MyStack<T>::Push(T item) 
{ 
    if(top == NULL) 
    { 
     top = new(struct Node<T>); 
     top->info = item; 
     top->next = NULL; 
    } else 
    { 
     Node<T>* temp; 
     temp = top; 
     top = new(struct Node<T>); 
     top->info = item; 
     top->next = temp; 
    } 
} 

template <class T> 
void MyStack<T>::Pop() 
{ 
    if(top == NULL) 
    { 
    } else 
    {  
     Node<T>* temp; 
     temp = top->next; 
     delete top; 
     top = temp; 
    } 
} 

template <class T> 
int MyStack<T>::Top() 
{ 
    return top; 
} 

template <class T> 
void MyStack<T>::Print() 
{ 
    if(top != NULL) 
    { 
     Node<T>* temp; 
     temp = top; 
     while(temp != NULL) 
     { 
      std::cout << temp << std::endl; 
      temp = temp->next; 
     } 
    } 
} 
#endif 

다음의 구현을 사용합니다 모든 파일에 '사용법 #include "mystack.ipp"' MyStack

관련 문제