static const std :: vector

时间:2012-12-07 14:42:20

标签: c++ static const private-members

我正在用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私有成员?

5 个答案:

答案 0 :(得分:5)

普通数组没有成员函数。我相信你正在寻找这个:

int zooms[] = {1,2,3,4,5,6,7,8,9,10};
const std::vector ImageModel::mZoomLevels(zooms, zooms + 10);

答案 1 :(得分:5)

阵列没有beginend成员。您可以使用begin的数组名称和结尾的数组名称加长度:

const std::vector mZoomLevels(zooms, zooms+10);

在C ++ 11中,您可以使用std::beginstd::end,如下所示:

const std::vector mZoomLevels(std::begin(zooms), std::end(zooms));

在这两种情况下,最好将zooms数组文件声明为静态或将其隐藏在命名空间中,以确保其名称不会“污染”全局命名空间。

答案 2 :(得分:1)

缩放是一个没有成员和方法的C风格数组,即zooms.beginzooms.end毫无意义。如果您使用兼容C ++ 11的编译器,请尝试std::begin(zooms)std::end(zooms)

答案 3 :(得分:1)

普通C ++数组不能包含成员。但是,您正在寻找静态调度,并且通过参数类型可以很好地处理重载。所以C ++ 11提供了std::beginstd::end非成员函数。 (已经提到了这一点。)

习惯于调用非成员函数的最佳实践,如下所示(在编写通用模板代码时确实很有用):

using std::begin;
using std::end;

const std::vector mZoomLevels(begin(zooms), end(zooms));

无论容器zooms是什么类型,这都将正常工作,并且它将利用ADL(依赖于参数的查找,有时称为Koenig查找)来查找begin和{{的实现如果end有一些自定义类类型,则在同一名称空间中。} / />

BTW,zoomsstd::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 };