我正在用Qt写一个图像查看器。 我试图在头文件中执行以下操作:
class ImageModel
{
private:
const static std::vector<int> mZoomLevels;
}
源文件中的:
int zooms[] = {1,2,3,4,5,6,7,8,9,10};
const std::vector<int> mZoomLevels(zooms.begin(),zooms.end());
但是我收到以下错误:
在缩放中请求成员'begin'是非类型'int [10]' 在缩放中请求成员'end'是非类型'int [10]'
有谁知道如何初始化这个静态const私有成员?
答案 0 :(得分:5)
普通数组没有成员函数。我相信你正在寻找这个:
int zooms[] = {1,2,3,4,5,6,7,8,9,10};
const std::vector ImageModel::mZoomLevels(zooms, zooms + 10);
答案 1 :(得分:5)
阵列没有begin
和end
成员。您可以使用begin
的数组名称和结尾的数组名称加长度:
const std::vector mZoomLevels(zooms, zooms+10);
在C ++ 11中,您可以使用std::begin
和std::end
,如下所示:
const std::vector mZoomLevels(std::begin(zooms), std::end(zooms));
在这两种情况下,最好将zooms
数组文件声明为静态或将其隐藏在命名空间中,以确保其名称不会“污染”全局命名空间。
答案 2 :(得分:1)
缩放是一个没有成员和方法的C风格数组,即zooms.begin
和zooms.end
毫无意义。如果您使用兼容C ++ 11的编译器,请尝试std::begin(zooms)
和std::end(zooms)
答案 3 :(得分:1)
普通C ++数组不能包含成员。但是,您正在寻找静态调度,并且通过参数类型可以很好地处理重载。所以C ++ 11提供了std::begin
和std::end
非成员函数。 (已经提到了这一点。)
习惯于调用非成员函数的最佳实践,如下所示(在编写通用模板代码时确实很有用):
using std::begin;
using std::end;
const std::vector mZoomLevels(begin(zooms), end(zooms));
无论容器zooms
是什么类型,这都将正常工作,并且它将利用ADL(依赖于参数的查找,有时称为Koenig查找)来查找begin
和{{的实现如果end
有一些自定义类类型,则在同一名称空间中。} / />
BTW,zooms
和std::begin
由C ++ 11提供,但您可以轻松地为早期版本编写自己的代码:
std::end
答案 4 :(得分:1)
我会根据您是否有权访问C ++ 11来遵循不同的方法。
在C ++ 03中,我会使用一个普通数组(因为它是const),甚至可能在类中,但在实现文件中的私有命名空间中(因为它是私有的,假设只有一个翻译unit包含ImageModel
)成员的定义。
// cpp
namespace {
static int gZoomLevels[] = { 1, 2, ... };
}
如果你真的想继续使用std::vector<int>
方法,我会在翻译单元中创建一个帮助函数,用于定义成员并使用它创建std::vector
,而不用静态创建不同的变量持续时间:
namespace {
static std::vector<int> chooseANameForInitializer() {
int data[] = { 1, 2, 3 };
return std::vector<int>( data, data + (sizeof data/sizeof *data) );
}
}
const std::vector<int> ImageModel::mZoomLevels = chooseANameForInitializer();
在C ++ 11中,我会使用std::array<int,...>
代替,因为这可以避免动态分配和额外间接的成本。虽然这不是一个很大的收获,但是当你不需要它提供的任何功能时,有std::vector<int>
没有意义。
class ImageModel
{
private:
static const std::array<int,10> mZoomLevels;
};
// cpp:
const std::array<int,10> ImageModel::mZoomLevels = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
同样,如果您坚持使用std::vector<int>
,那么您可以使用 list-initialization
const std::vector<int> ImageModel::mZoomLevels{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };