我有一个类中的数组成员,其长度我不知道(我有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_1
和array_2
已经腐烂成指针。我应该采取哪些正确的方法来解决问题,并使std::begin()
和std::end()
工作(在声明数组时我不知道数组的长度)?
我考虑过使用std::array
,但我仍然需要提供声明中的长度。
答案 0 :(得分:1)
begin
和end
功能模板仅适用于完整类型。您可以通过指定大小来简单地在头文件中填写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。