c++, 타입 정의없이 template function call 하는 방법에 대해서


한 list에서 서로 다른 타입의 변수를 가질 수 있는 doubly linked list를 구현하고 있습니다.

예시) 11 <-> "aa" <-> 'A' <-> 1.2345

main에서 함수의 타입 정의없이 get(int n) 함수를 통하여 list의 n번째에 저장되어 있는 값을 return하려고 하는데 잘되지 않아 도움을 요청드리려 글을 올립니다 ㅠㅠ

.hpp file

class node_base{
    public:
        node_base *next;
        node_base *prev;
        node_base () { next = 0; prev = 0; }
        virtual void print () = 0;
        virtual int get_node_size () = 0;
};

template <typename T>
class node : public node_base{
    public:
        T data;
        node (const T& val) : data(val) {}
        virtual void print (){ cout << data << " "; }
        virtual int get_node_size () { return sizeof (data); }
        T getData () { return data; }
};

class unvlist{
        node_base *head;
    public:
        int len;
        unvlist ();
        void print () {
            node_base *h = head;
            while (h->next != NULL){
                h->print ();
                h = h->next;
            }
            h->print ();
        }
        template <typename T> unvlist (const T* arr, int n);
        ~unvlist ();
        //operator +
        //operator ==
        template <typename T> void set (int n, const T& val);
        template <typename T> T get (int n);
        template <typename T> T insert (int n, const T& val);
        void erase (int n);
        int size ();
        void pop_back ();
        void pop_front ();
        template <typename T> void push_back (const T& val);
        template <typename T> void push_front (const T& val);
};
/* get 함수 : list의 n번째에 저장되어 있는 값을 리턴한다. */
template <typename T>
T unvlist :: get (int n){
    T retval;

    if (n >= len || n < 0){
        cout << "'In unvlist::get'-> Out of Bound!!!" << endl;
        return 0;
    }
    if (n >= 0){
        node_base *h = head;
        for (int i = 0; i < n; i++) { h = h->next; }
        retval = static_cast<node<T>*>(h)->getData ();
    }
    return retval;
}

main.cpp file

int main (){
    unvlist *l1 = new unvlist ();

    l1->push_back<string> ("aa");
    l1->push_back<char> ('A');
    l1->push_back<float> (1.2345);
    l1->push_front<int> (11);

    for (int i = 0; i < 4; i++){
        cout << l1->get (i) << " ";    // list에 있는 모든 값을 출력
    }   cout << endl;

    return 0;
}

compile error compile error


  • 위 설계대로라면, 논리적으로 get 함수에서 type을 추론할 수 있는 방법이 없습니다.     허대영(Daeyoung Heo)   2016.5.6 12:04     
조회수 254


1 답변


 template <typename T> T get (int n);

대신에, 반환 타입을 node 로 구현하고,

node get(int n);

node (혹은 node_base)에서 operator << 를 오버라이드하여 구현하는 건 어떤지요?

  • 2016년 05월 07일에 작성됨
    리눅스(유닉스) 기반의 시스템에서 웹 서비스를 개발하고 있습니다.

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close