【问题标题】:Not a member of global namespace?不是全局命名空间的成员?
【发布时间】:2012-07-26 06:08:18
【问题描述】:

我有错误:

错误 C2039: 'read' : is not a member of '`global namespace'' 和 错误 C2661:“Calc::SymString::read”:没有重载函数需要 3 个参数 从线: if (::read(fd_sock, &size, 4) != 4)

这个错误和类似的错误在我的代码中出现了很多。有谁知道是什么问题? 我正在使用 Windows Visual Studio 2010,并且正在从 Unix 迁移代码。 提前致谢!

【问题讨论】:

  • "没有重载函数...." 表示您显然有重载函数,并且您正尝试向其中一个或多个传递 3 个参数,但它们都不接受 3。检查您的函数原型,调用和错误定义。您可能想发布特定代码以获得真正的答案。

标签: c++ windows file-io


【解决方案1】:

read() 是 unistd.h 中定义的 UNIX 函数(在 LINUX 中)——我读过的所有文档都表明它不是标准的 C 函数。这可能是它在 UNIX 中编译但在 Windows 中不编译的原因。

在 UNIX 中 read() 采用文件描述符,但在 Windows 中等效的构造是“句柄”。

您的程序中真的需要低级文件描述符 I/O 吗?可以用fread这个标准的C函数吗?

This Microsoft support article 描述了 Windows 中可用的文件句柄类型:

There are multiple types of file handles that can be opened using 
the Win32 API and the C Run-time:

   Returned Type  File Creation API      API Set
   ---------------------------------------------
   HANDLE         CreateFile()           Win32
   HFILE          OpenFile()/_lcreat()   Win32
   int            _creat()/_open()       C Run-time
   FILE *         fopen()                C Run-time

【讨论】:

  • 啊,这真的很有帮助!实际上,我认为更改它的最简单方法可能是使用此来源:suacommunity.com/dictionary/read-entry.php。这是一个非常有用的移植词典。我不知道为什么我一开始就没有想到!谢谢!
  • @JorelEstrada 如果您觉得 AB 的回答有帮助,您应该点击向上箭头投票和/或点击复选标记接受它。
  • @Code-Guru 因为我还没有声望,所以我不能投票。我确实将其标记为答案!对于正在阅读并寻找我如何实际解决问题的任何人,我将 作为标题包含在内,并将读取更改为 _read 并将写入更改为 _write。此信息是通过我之前引用的移植字典找到的
  • @JorelEstrada 啊...我忘记了获得足够代表的能力。我很抱歉。我希望我能帮助你,但我已经用完了当天所有的选票;-(
【解决方案2】:

Microsoft 在 io.h 中声明了 Unix 风格的 I/O 函数。

尝试包含该标题 - 您可能会收到一堆关于使用已弃用名称的警告(MS 希望您使用名称 _read())。如果是这样,您可能需要定义宏 _POSIX_ 来消除这些警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 2021-01-02
    相关资源
    最近更新 更多