에 템플릿을 사용하면서 발생하는 문제가 생겨서 정리 해본다.

template < class T >
calss test
{
     std::queue< T > m_queue;
     T Pop()
     {
        if( m_Queue.empty() )
            return NULL;

        T data = m_Queue.front();
        m_Queue.pop();
        return data;
    }
}

예를 들어 위와 같은 template가 있다고 치자
그래서 아래와 같이 사용한다.
 int temp;
test<int> val;
temp = val.pop();
이런식으로 정적인 자료형을 선언 하면 값을 받아오는것이 가능하다
위에서는 queue에 값을 넣은게 없으니 그냥 NULL 값을 받을것이다.

하지만 문제가 되는건 아래와 같은 상황이다
 struct testTemplet
{
     int a;
     int b;
}

testTemplet temp;
test<testTemplet> val;
temp = val.pop();
코드상으로는 이상이 없어보이지만 컴파일러에서는 에러가 발생한다.

컴파일러 에러 내용은 아래와 같다.
 원인: 'int'에서 'const testTemplet'(으)로 변환할 수 없습니다.
소스 형식을 가져올 수 있는 생성자가 없거나 생성자 오버로드 확인이 모호합니다.

에러원인으로 생각되는것은 구조체형은 NULL이라는 값을 알수가 없기에 발생하는 문제이다.
동적으로 생성한다면 이와 같은 문제는 발생하지 않는다.
하지만 정적일 경우에는 위와 같은 코드로는 프로그램을 작성할수가 없다

일단 임시 방편으로 값을 받아오는 방법을 바꾸서 처리하니 해결은 되었지만 뭔가 그리 깔끔하지 않은거 같아 찝찝하긴 하다
아래는 내가 해결한 방법에 대해서 적어보겠다.
 template < class T >
calss test
{
     std::queue< T > m_queue;
     bool Pop( T& data )
     {
        if( m_Queue.empty() )
            return false;

        data = m_Queue.front();
        m_Queue.pop();
        return true;
    }
}

 struct testTemplet
{
     int a;
     int b;
}

testTemplet temp;
test<testTemplet> val;
if( true == val.pop( temp ))
{
    printf("정상적으로 값을 받음");
}
else
{
    printf("값을 받지 못했음");
}

이방법 말고 해결 방법이 있다면 누가 좀 알려주기 바란다.


by 널부러 2009. 3. 26. 16:23
| 1 |