2012-05-04 5 views
0

나는 오후 내내 이렇게 붙어있어 "함수를 통해 배열에 포인터를 건네주는 C++"를 시도했지만 작동하는 대답을 찾을 수 없으므로 여기에 문제.int 배열에 대한 포인터를 템플릿 함수로 전달

시작하기 전에이 질문은 OpenGL 질문이 아닙니다.이 질문은 배열 포인터 전달 질문입니다.

또한 '....'(4 도트)와 '...'(3 도트)가 섞이지 않도록하십시오. '....'(4 도트), ... (3 도트)는 함수에 전달 된 가변 매개 변수 수에 대한 타원 매개 변수입니다.

은 involed 네 개의 파일에서 미리보기입니다

OpenGL.h

class OpenGL { 
.... (other unrelated stuff) 

public: 
    int * iPixelFormatAttribList[]; <---------- 

.... 

utilities.h

template <typename T> void LoadArray (T * [], int, ...); <-------- 

utilities.cpp

// Dynamically Load Array. 
template <typename T> 
void LoadArray (T * Dest [], int count, ...) { <------- 
    va_list list; 
    va_start(list,count); 
    T * temp [] = new T [count]; 
    for (int cnt = 0; cnt < count; cnt++) 
     * Dest[cnt] = va_arg(list, T); 

    va_end(list); 
    Dest = temp; 
    delete [] temp; 
} 

의 OpenGL. cpp

void OpenGL::V3_SetupPixelFormat() { 
..... 

LoadArray (
    iPixelFormatAttribList,  15,   <--------- 
    WGL_DRAW_TO_WINDOW_ARB,  GL_TRUE, 
    WGL_SUPPORT_OPENGL_ARB,  GL_TRUE, 
    WGL_DOUBLE_BUFFER_ARB,  GL_TRUE, 
    WGL_PIXEL_TYPE_ARB,   WGL_TYPE_RGBA_ARB, 
    WGL_COLOR_BITS_ARB,   32, 
    WGL_DEPTH_BITS_ARB,   24, 
    WGL_STENCIL_BITS_ARB,  8, 
    0 
    // End of attributes list 
); 

좋아, 그럼 여기에 내가하려는 일. 저는 클래스 정의에서 (OpenGL.h, OpenGL 클래스), 그 공간은 어떤 멤버에게도 할당되어 있지 않습니다. 왜냐하면 내가 그것을 만들 때 배열에 필요한 매개 변수가 얼마나 많은지 알지 못하기 때문입니다. 동적으로 할당하고 목록을 설정하여 나중에 OpenGL 호출에 전달할 수있는 방법을 찾아야합니다.

(이와 같은 동적 로딩 목록을 설정하기로 결정한 또 다른 이유는 이와 같은 여러 배열이 포함되어 있고 배열이로드되어 있기 때문에 나중에 같은 유형의 기능이 두 배로 필요하고 벡터 데이터가 필요하지 않을 수 있기 때문입니다. 이 유틸리티 템플릿을 만드는 것은 앞으로 나아갈 생각 인 것 같습니다.)

모두 LOOKS 좋아요. 실제로는 컴파일되지만 연결되지 않습니다. 나는 다음과 같은 얻을 :

**** Internal Builder is used for build    **** 
windres --use-temp-file -i..\res\resource.rc -o..\res\resource_rc.o 
g++ -D_SS_DEBUG_ -ID:\Dev\Projects\Eclipse\OpenGL3\res -O0 -g3 -Wall -c -fmessage-length=0 -std=gnu++0x -o src\OpenGL.o ..\src\OpenGL.cpp 
g++ -D_SS_DEBUG_ -ID:\Dev\Projects\Eclipse\OpenGL3\res -O0 -g3 -Wall -c -fmessage-length=0 -std=gnu++0x -o src\main.o ..\src\main.cpp 
g++ -D_SS_DEBUG_ -ID:\Dev\Projects\Eclipse\OpenGL3\res -O0 -g3 -Wall -c -fmessage-length=0 -std=gnu++0x -o src\Utilities.o ..\src\Utilities.cpp 
g++ -D_SS_DEBUG_ -ID:\Dev\Projects\Eclipse\OpenGL3\res -O0 -g3 -Wall -c -fmessage-length=0 -std=gnu++0x -o src\App.o ..\src\App.cpp 
g++ -D_SS_DEBUG_ -ID:\Dev\Projects\Eclipse\OpenGL3\res -O0 -g3 -Wall -c -fmessage-length=0 -std=gnu++0x -o src\Win.o ..\src\Win.cpp 
g++ -o OpenGL3.exe src\main.o src\Win.o src\Utilities.o src\OpenGL.o src\App.o ..\res\resource_rc.o -lopengl32 -lglew32 -lglu32 -lkernel32 -lgdi32 -lcomdlg32 -luser32 
src\OpenGL.o: In function `ZN6OpenGL19V3_SetupPixelFormatEv': 
D:\Dev\Projects\Eclipse\OpenGL3\Debug/../src/OpenGL.cpp:54: undefined reference to `void LoadArray<int>(int**, int, ...)' 
collect2: ld returned 1 exit status 
Build error occurred, build is stopped 
Time consumed: 3000 ms. 

나에게 핵심 라인이 보이는 같은 :

LoadArray (
    iPixelFormatAttribList, 15, 
    WGL_DRAW_TO_WINDOW_ARB, GL_TRUE, 
    WGL_SUPPORT_OPENGL_ARB, GL_TRUE, 
    .... 

그리고이 나는 기능을하는 방식 부르고있다 말할 것 같다 무엇

undefined reference to `void LoadArray<int>(int**, int, ...)' 

템플릿 함수를 정의하고 있습니다.

template <typename T> void LoadArray (T * [], int, ...); 

과 :

template <typename T> 
void LoadArray (T * Dest [], int count, ...) { 

일치하지 않습니다. 나는 그렇게 많이 얻는다. 내가하지 않는 무엇

은 그래서 연결할 수 일치하도록 템플릿 (또는 전화)을 조정하는 방법 (즉, 내가 모두 망쳐 내 함수 서명. 있어요)

이에 대한 기본 개념을 배열 포인터, 요소 수 및 요소 목록으로 LoadArray를 호출하고 배열 요소가 포함 된 새 목록을 가리 키도록 포인터를 수정합니다.

이 작업을 수행하는 데있어 멋진 C++ 방법이있을 것이라고 확신하지만이 작업을 수행하는 방법을 이해해야합니다. (즉, 여기서 제가 잘못하고있는 것을 정확히 알면 배울 수 있습니다. 내가 잘못한 것을 가르쳐주지 않는 리디렉션 솔루션이 아니라, 내가 잘못한 것을 가르쳐주지 않을 것입니다. 이처럼 배열 포인터를 사용하면 오른쪽의 흑 마법을 이해할 수 없습니다.

고마워요.

답변

0

모든 템플릿 코드를 헤더 파일로 이동하십시오. 이는 컴파일러가 여러 템플릿 매개 변수에 대한 템플릿 클래스의 인스턴스를 인스턴스화하는 것을 의미합니다. 이 작업을 수행하지 않으면 필요한 유형의 템플릿을 강제로 인스턴스화해야합니다.

+0

그 일을 한 것 같아요, 내가 본 적이 없었던 모든 문제를 발견하기 시작했는데, 그것은 결코 구체화되지 않았기 때문입니다. (sp?) 그것을보고 난 다른 문제의 지뢰밭을 걷고 있을지 모르지만, 내가 필요로하는 중요한 것을 배웠다. 아래의 대답은 정확했지만이 대답에 의존했습니다. (나는 ** 시도했지만 이것을 이해하지 못했다) 내 다음 우려는 배열의 메모리 할당/할당 취소라고 생각하지만, 이는 그 문제의 범위를 벗어난다. 감사!! – Quade2002

0

은 왜 그냥

template <typename T> 
void LoadArray(T **Dest, int count, ...) { 

으로 템플릿을 정의하지 않습니다 그리고 함께 할 수?

+0

아니요. 'void LoadArray (int **, int, ...)'에 대한 정의되지 않은 참조 ' – Quade2002

+0

편집 : 위의 답변과 결합한 후 지금 동의하는 것으로 보입니다. (두 가지 문제로 보입니다.) – Quade2002

+0

@ Quade2002, 다행 이군요! –

관련 문제