(C ++ 14)lambdas数组:错误:' name'声明为' auto'

时间:2018-05-03 04:23:35

标签: c++ arrays lambda c++14

我很难搞清楚这个错误。我承认,我是c ++的新手,我的困难来自于不理解错误信息。

以下是代码:

auto selectionFuncs[8] =
{
    [&](const Vector3& min, const Vector3& max) 
    { 
      return max.x_ == seamValues.x_ || max.y_ == seamValues.y_ || max.z_ == seamValues.z_;
    },

    [&](const Vector3& min, const Vector3& max) 
    { 
      return min.x_ == seamValues.x_; 
    },

    [&](const Vector3& min, const Vector3& max) 
    { 
      return min.z_ == seamValues.z_; 
    },

    [&](const Vector3& min, const Vector3& max) 
    { 
      return min.x_ == seamValues.x_ && min.z_ == seamValues.z_; 
    },

    [&](const Vector3& min, const Vector3& max) 
    { 
      return min.y_ == seamValues.y_; 
    },

    [&](const Vector3& min, const Vector3& max) 
    { 
      return min.x_ == seamValues.x_ && min.y_ == seamValues.y_; 
    },

    [&](const Vector3& min, const Vector3& max) 
    { 
      return min.y_ == seamValues.y_ && min.z_ == seamValues.z_; 
    },

    [&](const Vector3& min, const Vector3& max) 
    { 
      return min.x_ == seamValues.x_ && min.y_ == seamValues.y_ && min.z_ == seamValues.z_; 
    }
};

这就是错误:

error: ‘selectionFuncs’ declared as array of ‘auto’

从谷歌搜索,似乎在这个例子中使用auto是不允许在C ++ 11中但它应该在C ++ 14中,但是我必须以某种方式宣布它是错误的并且无法解决它。

非常感谢帮助,谢谢!

2 个答案:

答案 0 :(得分:6)

C ++语言禁止使用auto声明数组。你有两个不错的选择:函数指针甚至更好 - std::function。像这样:

std::function<bool(const Vector3&, const Vector3&)> selectionFuncs[8] =
{
    [&](const Vector3& min, const Vector3& max) 
    { 
      return max.x_ == seamValues.x_ || max.y_ == seamValues.y_ || max.z_ == seamValues.z_;
    },

    [&](const Vector3& min, const Vector3& max) 
    { 
      return min.x_ == seamValues.x_; 
    },

    // ...
};

不要忘记#include <functional>。然后你就像使用任何其他函数一样使用数组的元素。

答案 1 :(得分:5)

如果您只是将lambda存储在数组中以方便代码而不是运行时选择,则不必将它们存储在数组中。元组可以做同样的事情:

<?php

function cartesian(array $x,array $y): array
{
    $result = [];
    $size = count($x) * count($y);
    $posX = 0;
    $posY = 0;
    for($i = 0; $i < $size; $i++) {
        if (!isset($x[$posX])) {
            $posX = 0;
        } elseif(!isset($y[$posY])) {
            $posY = 0;
        }
        $result[] = [$x[$posX],$y[$posY]];
        $posX++; $posY++;
    }
    return $result;
}

$x = array('A', 'B', 'C', 'D');

$y = array('X', 'Y', 'Z');

print_r(cartesian($x,$y));

但是如果你真的想要运行时选择,你必须将lambdas转换为auto selectionFuncs = std::make_tuple( [&](const Vector3& min, const Vector3& max) { return max.x_ == seamValues.x_ || max.y_ == seamValues.y_ || max.z_ == seamValues.z_; }, //... 或函数指针(在另一个答案中进一步解释),因为这是C ++类型系统如何工作的函数和lambda(Lambdas是不同的类型,但如果它们是无状态的,则可以转换为它们各自的函数类型。)