0

我整个下午都被困在这个问题上,甚至尝试了以下搜索:“c++ 通过函数将指针传递给数组”,但找不到有效的答案,所以这是我的问题。

在我开始之前,拜托,这不是一个 OpenGL 问题,这是一个数组指针传递问题。

另外,不要将“....”(4 点)与“...”(3 点)混淆。我用“....”(4个点)跳过了很多代码,...(3个点)是传递给函数的可变数量参数的椭圆参数。

这些是涉及的四个文件的片段:

OpenGL.h

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

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

....

实用程序.h

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

实用程序.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 调用。

(我决定像这样设置一个动态加载列表的另一个原因是因为像这样涉及多个数组,加载数组,并且我以后可能还需要这种相同类型的功能与双精度数,而不是矢量数据。创建此实用程序模板似乎是一种前瞻性的思维方式。)

这一切看起来都很好,事实上,它编译干净,但它没有链接。我得到以下信息:

**** 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, ...) {

不匹配。我得到那么多。

我没有得到的是如何调整模板(或调用)以便它们匹配以便它可以链接(即我的函数签名都搞砸了。)

其基本思想是,我用数组指针、元素计数和元素列表调用 LoadArray,它修改指针,使其指向包含数组元素的新列表。

我确信有很多花哨的 C++ 方法可以做到这一点,但我想了解如何让它工作,因为它看起来应该在这里。(即,如果我知道我在这里做错了什么,它会帮助我了解,而不是一个重定向解决方案,它不会教我我做错了什么,我知道我在传递的语法中遗漏了一些东西像这样的数组指针,我只是想不出正确的黑魔法来让它正确。)

谢谢。

4

2 回答 2

0

你为什么不把你的模板定义为

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

并完成它?

于 2012-05-04T07:49:31.383 回答
0

将所有模板代码移动到头文件。这使得编译器可以直接为不同的模板参数实例化模板类的实例。如果你不这样做,那么你需要为你需要的类型强制实例化模板。

于 2012-05-04T07:55:02.320 回答