私有嵌套结构的std :: array无法初始化(错误C2248)

时间:2015-12-02 20:40:10

标签: c++ visual-studio-2015

以下代码在ideone(C ++ 14,link)中正确编译:

#include <iostream>
#include <array>
#include <vector>

class Foo {
public:
    void foo() { auto stashedCells = cells; }
private:
    struct Bar { std::vector<int> choices; };
    std::array<Bar, 10> cells;
};

int main() {
    Foo foo;
    foo.foo();
}

但是,在Visual Studio 2015中,它会产生以下错误:

1>  main.cpp
1>c:\program files (x86)\microsoft visual studio 14.0\vc\include\array(220): error C2248: 'Foo::Bar': cannot access private struct declared in class 'Foo'
1>  c:\users\alcedine\documents\visual studio 2015\projects\mvce\mvce\main.cpp(9): note: see declaration of 'Foo::Bar'
1>  c:\users\alcedine\documents\visual studio 2015\projects\mvce\mvce\main.cpp(5): note: see declaration of 'Foo'
1>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\array(220): note: This diagnostic occurred in the compiler generated function 'std::array<Foo::Bar,10>::array(const std::array<Foo::Bar,10> &)'

如果Foo::Bar为空或仅包含int,则单元成功编译,因此它似乎不是由访问说明符引起的,尽管如此编译器消息也是如此。

这是由于C ++ 11和C ++ 14之间的某些差异吗? Visual Studio在这里表现正常吗?

1 个答案:

答案 0 :(得分:2)

这似乎是MSVC2015的错误。

问题与您在foo()中创建的数组的复制结构有关。它似乎与std::array的实现没有直接关系,因为boost::array产生完全相同的错误。

解决方法是从复制中拆分构造,例如:

void foo()
{
    decltype(cells) stashedCells;   // this works 
    stashedCells = cells;           // this works 
}

或者:

void foo()
{
    std::array<Bar, 10> stashedCells; 
    stashedCells = cells;
}

其他可能的解决方法,例如对阵列使用公共typedef或类型别名和/或Bar始终失败。公开Bar时,错误才会消失。