c++ 템플릿 함수 소멸자에대해서 질문 있습니다. 괴수님들 부탁드립니다 ㅠㅠ

조회수 1150회
#pragma once
template <typename Elem>
class NodeList{
public:
    class Node {
    public:
        Elem elem;
        Node* prev;
        Node* next;

    };
    //template <typename Elem> friend class NodeSequence;
public :
    Elem& operator*() { return v->elem; };
    bool operator==(const Node* p) const { return v == p.v; };
    bool operator!=(const Node* p) const { return v != p.v; };
    Node* operator++() { v = v->next; return *this; };
    Node* operator--() { v = v->prev; return *this; };
private: 
    Node* v;
public:
    NodeList() {
        n = 0;
        header = new Node;
        trailer = new Node;
        header->next = trailer;
        trailer->prev = header;
    };
    virtual ~NodeList() {
        while (!empty()) {
            eraseFront();
        }
    };
    int size() const {
        return n;
    };
    bool empty() const {
        return (n == 0);
    };
    Node* begin() const {
        return header->next;
    }
    ;
    Node* end() const {
        return (trailer);
    };
    void insertFront(const Elem& e) { insert(begin(), e); };
    void insertBack(const Elem& e) { insert(end(), e); };
    void insert( Node* const p,const Elem& e) {
        Node*w = p;
        Node*u = w->prev;
        Node*v = new Node;
        v->elem = e;
        v->next = w; w->prev = v;
        v->prev = u; u->next = v;
        n++;
    };
    void eraseFront() {
        erase(begin());
    };
    void eraseBack() {
        erase(--end());
    };
    void erase(Node* const p) {
        Node* w = p->next;
        Node* u =p->prev;
        u->next = w; w->prev = u;
        delete v;
        n--;
    };
private:
    int n;
    Node* header;
    Node* trailer;
};
template <typename Elem>
class NodeSequence :public NodeList<Elem> {
public:
    NodeSequence() {
        typename NodeSequence::NodeList::NodeList(); };
     ~NodeSequence() { typename NodeSequence::NodeList::~NodeList<Elem>(); };
    typename NodeList<Elem>::Node* atIndex(int i) const {
        typename NodeSequence::NodeList::Node* p= typename NodeSequence::begin();
        for (int j = 0; j < i; j++)++p;
        return p;
    };
    int indexof(const typename NodeList<Elem>::Node* p)const {
        typename NodeSequence::NodeList::Node* q = typename NodeSequence::begin();
        int j = 0;
        while (q != p) {
            ++q; ++j;
        }
        return j;
    }
};
#include <iostream>
using namespace std;

#include "sequence.h"

void main() {
    typedef NodeSequence<int> IntSequence;
    typedef NodeSequence<int>::Node* IntSequenceNodePtr;
    int a[] = { 6, 7, 2, 5, 1, 4, 3 };
    IntSequence ns;
    for (int i = 0; i < 7; i++) ns.insertFront(a[i]);
    cout << "A sequence of size = " << ns.size() << endl;
    system("pause");
}

첫번째 코드는 sequence.h헤더파일이고, 두번째는 메인문 CPP파일 입니다. 헤더파일의 Sequence class 에서 생성자와 소멸자를 만드려는데 이와같은 에러가 뜹니다 ㅠㅠㅠ 어떻게 해야 할까요??

이미지

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    아래와 같이 수정하여 컴파일 해보시기 바랍니다.

    NodeSequence() {
            typename NodeSequence::NodeList::template NodeList<Elem>(); };
         ~NodeSequence() { typename NodeSequence::NodeList::template ~NodeList<Elem>(); };
    

    자세한 내용은 아래 링크에서 C7510 으로 검색하면 아래와 같은 내용을 확인할 수 있습니다.

    https://docs.microsoft.com/ko-kr/cpp/cpp-conformance-improvements-2017?view=vs-2017

    템플릿 키워드 및 중첩된 이름 지정자 /permissive- 모드에서 컴파일러는 종속된 중첩된 이름 지정자 뒤에 오는 경우 template 키워드가 템플릿 이름 앞에 오도록 요구합니다. /permissive- 모드에서 다음 코드는 C7510: 'foo': 종속 템플릿 이름은 'template'과 함께 사용해야 합니다. 참고: 컴파일 중인 클래스 템플릿 인스턴스화 'X'에 대한 참조를 확인하십시오. 를 생성합니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • NodeSequence() { typename NodeList::NodeList(); }; ~NodeSequence() {NodeList::~NodeList(); }; 이렇게 하니깐 잘되네요 ㅠㅠ 감사합니다 강명진 2019.1.12 15:36

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)