std :: begin()和std :: end()不适用于类中未知长度的数组

时间:2017-04-09 22:16:10

标签: c++ arrays c++11

我有一个类中的数组成员,其长度我不知道(我有C ++ 11支持):

A.H:

class A {
    static int array_1[];
    int array_2[];
};

A.cpp:

int A::array_1[] = {1,2,3};
A::A():array_2{1,2,3} {
    std::sort(std::begin(array_1), std::end(array_1)); // compilation error
    std::sort(std::begin(array_2), std::end(array_2)); // compilation error
}

错误消息(MSVC):错误C2672' std :: begin':没有匹配的重载函数

我认为这两个错误都是因为array_1array_2已经腐烂成指针。我应该采取哪些正确的方法来解决问题,并使std::begin()std::end()工作(在声明数组时我不知道数组的长度)?

我考虑过使用std::array,但我仍然需要提供声明中的长度。

1 个答案:

答案 0 :(得分:1)

beginend功能模板仅适用于完整类型。您可以通过指定大小来简单地在头文件中填写A::array_1的类型:

class A {
    static int array_1[3];
    //                ^^^
};

或者,如果您只需要在随附的源文件中使用完整类型,只需确保在静态数据库{{1>的成员定义之后所有使用完整类型的完成其类型:

int A::array_1[] = {1,2,3};

请注意,struct A { static int x[]; A(); }; #include <iostream> #include <iterator> int A::x[] = {3, 1, 2}; // Type of A::x is complete at this point. A::A() { for (auto it = std::begin(x); it != std::end(x); ++it) std::cout << *it << "\n"; } 的班级成员定义不正确; 必须才能完成,因为它是非静态数据成员。有关详细信息,请参阅this question