【问题标题】:Error c2248 when exporting a class that has a private member of type std::stack<std::unique_ptr<T>>导出具有 std::stack<std::unique_ptr<T>> 类型的私有成员的类时出现错误 c2248
【发布时间】:2016-08-18 21:42:17
【问题描述】:

为什么会出现这个错误:

Error   2   error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>' c:\program files (x86)\microsoft visual studio 11.0\vc\include\xmemory0 606 1   UNIQUE_PTR

尝试使用__declspec(dllexport) 导出此类时?

class __declspec(dllexport) A
{
private:
    std::stack<std::unique_ptr<int>> ints;
};

我用的是 vs2012

【问题讨论】:

  • 真的不能说,我猜是因为试图访问ints的人没有访问权限,因为是私有的。
  • 这是我编译的所有代码,除了一个返回 0 的 main。我没有实例化那个类,我什么也不做
  • 我会尝试使用新的编译器。 MSVS 2012 不符合 C++11。如果您必须留在 MSVS 世界,那么我会尝试 MSVS 2015。
  • 好的,我家里装了vs2013,我试试看。
  • 我会使用 GCC 5.x,但我似乎无法让它在 Windows 上运行 :(

标签: c++ c++11 stl stack unique-ptr


【解决方案1】:

我不了解 Visual Studio,因此无法确定错误消息的含义,但我可以看到您的类无法使用:唯一的成员变量是私有的,并且您没有编写任何方法来访问它.

【讨论】:

  • 添加了一个功能,还是报错。顺便说一句,在我添加 std::stack<:unique_ptr>> 类型的私有成员之前,我在另一个项目中有一个更大的类,它编译得很好,但是感谢您的建议
  • 究竟是什么功能?见stackoverflow.com/questions/30441287/…,可能重复的问题
  • 试图访问该成员。我知道我必须使用访问器从课堂外访问它。
  • ... 并且我认为也是为了避免这个错误。编写一个 setter 和一个 getter,看看会发生什么。
  • 反正这可能和unique_ptr有关,见stackoverflow.com/questions/21871247/…
【解决方案2】:

据我了解,std::stack 假设元素可以复制,而 std::unique_ptr 则不是这样,必须移动 .

所以问题在于 std::stack 无法访问 std::unique_ptr 的私有复制构造函数,而不是 std::stack 本身是私有的。

【讨论】:

  • 但是我在多个地方读到使用 std::unique_ptr 和 stl Containers 应该可以工作......而且我非常确定我已经得到了这样的工作
【解决方案3】:

根据https://support.microsoft.com/en-us/kb/168958,您在导出stackunique_ptr 时可能会遇到一些困难。 (由于stack 使用deque

一些 STL 类包含嵌套类。这些类不能 出口。例如,deque 包含一个嵌套类 deque::iterator。 如果你导出双端队列,你会得到一个警告,你必须导出 双端队列::迭代器。如果你导出 deque::iterator,你会得到一个警告: 你必须导出双端队列。这是由设计的限制引起的 模板类一旦实例化,就不能重新实例化 并出口。 目前唯一可以导出的 STL 容器 是向量。其他容器(即map、set、queue、list、 deque) 都包含嵌套类,无法导出。

【讨论】:

  • 我尝试了没有 std::unique_ptr 的相同代码,所以只需 std::stack 就可以了。我可以毫无问题地向堆栈推送/弹出堆栈。
猜你喜欢
  • 2015-04-15
  • 2022-01-12
  • 2015-10-11
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
相关资源
最近更新 更多