2012-05-04 32 views
0

私はこの午後すべてに立ち往生していましたが、「関数経由でポインタを渡す」という次の検索を試みましたが、実際の答えを見つけることができません。質問。int配列へのポインタをテンプレート関数に渡します

私が始める前に、これはOpenGLの質問ではありません。これは配列ポインタ渡しの質問です。

また、「....」(4ドット)が「...」(3ドット)と混同しないようにしてください。 「....」(4ドット)、...(3ドット)は、関数に渡される可変数のパラメータの楕円パラメータです。

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:

これらはinvoledの4つのファイルからの抜粋です。 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クラス、OpenGLクラス)では、そのスペースはメンバーに割り当てられていないことがわかっています。作成すると、配列に必要なパラメータの数がわかりませんリストを動的に割り当てて設定する方法を見つける必要があるので、後でOpenGL呼び出しに渡すことができます。

(このような動的ローディングリストを設定する別の理由は、このような配列がいくつか含まれていたためですが、後で同じタイプの機能が必要になることがあります。このユーティリティテンプレートを作成することは、前向きに考えているようです。)

ThisすべてLOOKS Ok、実際にはクリーンですが、リンクされません。私は、次を得る:

**** 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. 

私にキー行は次のようになります。

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

これが何を言うようですが、私は関数を呼び出しています方法です:

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

そして、私はテンプレート関数を定義しています:

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

と:

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

が一致しません。私はそれを多く得る。私は得ることはありません何

は、彼らはそれをリンクすることができます一致するようにテンプレート(またはコール)を調整する方法である(つまり、私はすべてが台無しに私の関数のシグネチャ。GOT)

これに対する基本的な考え方をは、配列の要素、要素の数、および要素のリストをLoadArrayに呼び出し、配列要素を含む新しいリストを指すようにポインタを変更します。

私は確かにこれを行うためのC + +の方法がありますが、私はそれがここにあるように見えるようにこの作品を作る方法を理解したいと思います。 (つまり、私がここで間違っていることを正確に知っているかどうかを知ることができたら、私が間違ったことを教えてくれないリダイレクトソリューションではなく、このような配列ポインタは、私は正しい黒魔法を理解することができません。)

ありがとう。

答えて

0

すべてのテンプレートコードをヘッダーファイルに移動します。これにより、コンパイラーは、さまざまなテンプレート・パラメーターのテンプレート・クラスのインスタンスをインスタンス化できます。これをしないと、必要なタイプのテンプレートをインスタンス化する必要があります。

+0

それはそれをしたようだ、私はそれがインスタンス化されたことがないので、私が見ていなかったすべての問題を見つけることを開始。 (SP?)それを見た後、私は他の問題の地雷に歩いているかもしれないと確信していますが、ここで私が必要としていた重要なことを学びました。以下の答えは正しいが、この答えに依存していた。 (私は**を試みましたが、これを理解できませんでした)私は次の懸念が配列のメモリの割り当て/割り当て解除であると考えていますが、それは問題の範囲を超えています。感謝!! – Quade2002

0

は、なぜあなたはちょうど

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

そして、それを使って行うこととして、あなたのテンプレートが定義されていませんか?

+0

いいえ。 "void LoadArray (int **、int、...) 'への未定義の参照 – Quade2002

+0

編集:上記の答えと組み合わせて、今すぐ受け入れられたようです。 (2つの問題と思われる) – Quade2002

+0

@ Quade2002、うれしいことにはうまくいきました! –

関連する問題