将指向int数组的指针传递给模板函数

时间:2012-05-04 07:44:27

标签: arrays function pointers

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

在开始之前,请问,这不是一个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.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的类),这个空间没有分配任何成员,因为当我创建它,我不知道我有多少paramters会需要一个数组,我需要找到一种方法来动态分配和设置列表,以便我可以将它传递给以后的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.  

给我的关键是:

  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 ++方法可以做到这一点,但我想知道如何使这个工作,因为它似乎应该在这里。 (也就是说,如果我知道我在这里做错了什么,而不是一个不会教我错误的重定向解决方案,它会帮助我学习,我知道我在遗漏的语法中遗漏了一些东西像这样的数组指针,我只是无法弄清楚正确的黑魔法才能使它正确。)

感谢。

2 个答案:

答案 0 :(得分:0)

为什么不将模板定义为

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

完成它?

答案 1 :(得分:0)

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