http://supercoding.tistory.com/3에 나와있는 내용을 초금 수정 한 버전..


#include "stdafx.h"
#include <windows.h>
#include <vector>

template <typename T>
class Array2D
{
public:
    Array2D(const unsigned int maxSizeX
, const unsigned int maxSizeY
, std::vector<T>& dataArray)
        : m_isInit(false)
        , m_dataArray(dataArray)
        , m_maxSizeX(maxSizeX)
        , m_maxSizeY(maxSizeY)
    {
        if (m_dataArray.size() == (m_maxSizeX * m_maxSizeY))
            m_isInit = true;
    }

    ~Array2D()
    {
        m_isInit = false;
    }

    // 제대로 세팅 되었는지 여부
    bool IsInit() { return m_isInit; }

    const int GetMaxSizeX() { return m_maxSizeX; }
    const int GetMaxSizeY() { return m_maxSizeY; }

    T& operator()(const unsigned int x, const unsigned int y)
    {
        return m_dataArray.at((y * m_maxSizeX) + x);
    }
    const T& operator()(const unsigned int x, const unsigned int y) const
    {
        return m_dataArray.at((y * m_maxSizeX) + x);
    }

private:
    bool m_isInit;

    const unsigned int m_maxSizeX;
    const unsigned int m_maxSizeY;

    std::vector<T>& m_dataArray;

};

int _tmain(int argc, _TCHAR* argv[])
{
    // 3*3 2차원 배열에 들어가는 개수 9개 세팅 (초기화)
    std::vector<BYTE> array;
    for (int i = 0; i < 9; i++)
        array.push_back(0);

    // 2차원 배열 사용...
    Array2D<BYTE> temp(3, 3, array);

    try
    {
        // 좌표 시작값은 0부터 시작
        temp(1, 1) = 1;
    }
    catch (std::exception e)
    {
        // 좌표가 오버 하면 에러 나오겠죠...
        printf("%s", e.what());
        return -1;
    }

    // 출력용
    for (int x = 0; x < temp.GetMaxSizeX(); x++)
    {
        for (int y = 0; y < temp.GetMaxSizeY(); y++)
        {
            printf("%d ", temp(x, y));
        }
        printf("\n");
    }

    return 0;
}



by 널부러 2018. 10. 19. 15:46
에 템플릿을 사용하면서 발생하는 문제가 생겨서 정리 해본다.

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 |