我整个下午都被困在这里,甚至尝试了以下搜索:“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 ++方法可以做到这一点,但我想知道如何使这个工作,因为它似乎应该在这里。 (也就是说,如果我知道我在这里做错了什么,而不是一个不会教我错误的重定向解决方案,它会帮助我学习,我知道我在遗漏的语法中遗漏了一些东西像这样的数组指针,我只是无法弄清楚正确的黑魔法才能使它正确。)
感谢。
答案 0 :(得分:0)
为什么不将模板定义为
template <typename T>
void LoadArray(T **Dest, int count, ...) {
完成它?
答案 1 :(得分:0)
将您的所有模板代码移动到头文件中。这使得编译器可以直接为不同的模板参数实例化模板类的实例。如果您不这样做,那么您需要强制实例化您需要的类型的模板。