2016-09-25 67 views
-1

我定义下面的模板函数,该函数数组模板函数崩溃

template <typename X, typename Y, size_t n>  
array <Y, n> lod (const function <Y (const X)> f, const array <X, n> w) 
{ 
    array <Y, n> l; 
    for (GLint i = 0; i = i + 1; i < n) 
     l [i] = f (w [i]); 
    return l; 
} 

为f的一个例子中的每个元素应用一个函数f,我定义一个函数“添加一个”

template <typename X> 
function <X (const X)> ae (const X a) 
{ 
    return [a] (const X x) 
    { 
     return x + a; 
    }; 
} 

然后我尝试将其应用

const array <ivec3, 12> oblad = {ivec3 (0, 2, 1), ivec3 (0, 3, 2), ivec3 (0, 1, 5), ivec3 (0, 5, 4), 
           ivec3 (1, 2, 6), ivec3 (1, 6, 5), ivec3 (2, 3, 7), ivec3 (2, 7, 6), 
           ivec3 (3, 0, 4), ivec3 (3, 4, 7), ivec3 (4, 5, 6), ivec3 (4, 6, 7)}; 

array <ivec3, 12> w = lod (ae (ivec3 (1)), oblad); 

的程序编译就好了,但是在执行时崩溃。

从你身边路过阵列由值的事实
+0

一旦'i'达到'n',你的循环写出数组的边界。你的意思可能是'for(GLint i = 0; i

+0

这不是循环的工作方式。请参阅C++上的任何基础教科书。 –

+1

投票关闭作为错字(搞乱for循环条件顺序) –

回答

0

除此之外,坠机的原因很简单:

for (GLint i = 0; i = i + 1; i < n) 

这应该是

for (GLint i = 0; i < n; i = i + 1) 

你的循环的版本是有条件的i = i + 1对于i的所有值返回true,当加1时,不包装到0。在每个循环结束时,您正在执行测试i < n,但结果被忽略。

- 编辑 -

根据the standard for循环的语法是:

for (init-statement conditionopt ; expressionopt) statement 

conditionopt是条件在循环的每次迭代的开始测试,expressionopt是在每次迭代的处执行的可选表达式。

+0

本来希望编辑你的代码,但我不能,因为它只是一个';'丢失在你的编辑:( – Zouch

+0

@ Zouch这是从标准复制和粘贴:https://1drv.ms/i/s!AoIctv5uIJy5hLM8nJIEjuQHOu_fgQ – kfsone

+0

回滚 - 标准实际上是正确的(不出所料),定义* for -init-statement *包含它以分号结尾 –