以下代码在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在这里表现正常吗?
答案 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
时,错误才会消失。