我正在尝试将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驱动器上上传了相关代码(只有三个文件“ 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之前就已经在那里),因此找不到它。如果您想这样做,则必须修改这些函数的调用方式。

10-01 05:24