gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:18:55 27 4
gpt4 key购买 nike

以下代码在 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 在这里的行为是否正确?

最佳答案

这似乎是 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;
}

其他潜在的解决方法,例如使用公共(public) typedef 或数组的类型别名和/或 Bar 总是失败。只有在公开 Bar 时错误才会消失。

关于c++ - 无法初始化私有(private)嵌套结构的 std::array(错误 C2248),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34052576/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com