4

我很难弄清楚这个错误。我承认,我是 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 中,但是我必须以某种方式声明它是错误的并且无法弄清楚。

非常感谢您的帮助,谢谢!

4

2 回答 2

8

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>。然后,您只需像使用任何其他函数一样使用数组的元素。

于 2018-05-03T04:28:37.110 回答
5

如果您只是为了代码方便而不是为了运行时选择而将 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_;
    },
    //...

但是,如果您确实想要运行时选择,则必须将 lambdas 转换为std::functions 或函数指针(在另一个答案中进一步解释),因为这就是 C++ 类型系统如何与函数和 lambdas 一起工作(Lambdas 是不同的类型,但可以强制转换如果它们是无状态的,则为它们各自的函数类型)。

于 2018-05-03T04:34:30.277 回答