C++ 错误 : ‘::close’ has not been declared miniSAT

标签 c++ namespaces

我正在尝试将 miniSAT 1.14 嵌入到我的程序中。 我需要将命名空间添加到所有文件。

#include "File.h"

void File::open(int file_descr, FileMode m, bool own)
{
    if (fd != -1) ::close(fd);
    fd     = file_descr;
    mode   = m;
    own_fd = own;
    pos    = 0;
    buf    = xmalloc<uchar>(File_BufSize);
    if (mode == READ) size = read(fd, buf, File_BufSize);
    else              size = -1;
}
//........

当我尝试添加命名空间“miniSAT”时

#include "File.h"
namespace minisat{

void File::open(int file_descr, FileMode m, bool own)
{
    if (fd != -1) ::close(fd);
    fd     = file_descr;
    mode   = m;
    own_fd = own;
    pos    = 0;
    buf    = xmalloc<uchar>(File_BufSize);
    if (mode == READ) size = read(fd, buf, File_BufSize);
    else              size = -1;
}

我遇到以下错误 错误:'::close' 尚未声明

然而在另一个版本的 miniSAT 中我可以编译成功。

谁能说出它们之间的区别?

我在google drive上上传了相关代码(只有三个文件"File.cpp","File.h","Global.h")。

https://drive.google.com/drive/folders/0B5t7DJpKfL7UUU1MSXFWZnZDUTg?usp=sharing

后缀为'1'的就是我能编译的。

但我需要再编译一个。

谁能帮帮我?

最佳答案

MiniSAT 将其函数包装在名为 Minisat 的命名空间中,而 MiniSAT+ 将它们包装在 MiniSat 命名空间中(注意两者之间的区别,即大写的“S”在第二种情况下)。 C++ 区分大小写,因此这是两个不同的命名空间,不应有任何名称冲突。 MiniSAT+ 在全局命名空间中保留了一些函数,这是一个不好的做法,但另一方面,MiniSAT 似乎将其所有函数和类都放在适当的命名空间中,因此在从 MiniSAT+ 获取全局函数的情况下应该没有名称冲突任何一个。总结一下:您可能不需要在自己的命名空间中包装任何东西。每当您使用同名函数时,只需引用正确的命名空间即可。另请注意,即使两个函数具有相同的名称并位于相同的命名空间中,但采用不同的参数,也不会发生名称冲突。

至于你的错误,你得到它是因为你将 close() 函数放在 minisat 命名空间中,而 open() 函数调用 ::close(),即它在全局命名空间中查找 close() 函数 - 它不再存在(它在您之前就存在)将其移至 minisat),因此无法找到。如果你想这样下去,你必须修改这些函数的调用方式。

关于C++ 错误 : ‘::close’ has not been declared miniSAT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45775932/

相关文章:

c++ - libvlc 的手册页

symfony - 在 Symfony 2.2 中找不到类

c++ - 为什么我的类友元函数无法访问具有命名空间的 protected 成员?

c# - 存储分层 Const 数据

c++ - wxwidgets:使用 CMake 链接到 wxMediaCtrl

python - 使用 Fast/Faster-RCNN 在 C++ 上制作对象检测器的最简单方法是什么?

c++ - getline函数跳到下一个输入语句

c++ - 如何查看修改后的代码,其中对内联函数进行了预处理

fortran - 编译不同的文件,其中函数和公共(public) block 具有相同的名称

spring - 创建自己的 xml 命名空间