我正在尝试将 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/