【发布时间】:2013-03-21 06:54:12
【问题描述】:
我最近决定在我的项目中加入 JavaScript V8 引擎。编译并链接到它之后,我想运行 Getting Started 指南中的示例。
它通常可以工作,但是由于某些原因,当我没有在每个类名前面指定 v8 命名空间时,会出现命名空间冲突。例如,Visual Studio 2012 告诉我,名称 Context 会模棱两可。但我不明白为什么。
我在这个文件中包含的唯一命名空间是std 和v8。它是一个头文件,在你问之前,它应该是这样的,因为它声称是一个只有头文件的库。
#pragma once
#include <string>
#include <vector>
#include <map>
#include <unordered_map>
#include <functional>
#include <memory>
#include <typeindex>
#include <iostream>
#include <fstream>
#include <V8/v8.h>
namespace library_name
{
using namespace std;
using namespace v8;
// here comes the example code and more...
}
为了找出名称为Context 的符号也可能在哪里定义,我在Visual Studio 中使用了上下文菜单中的Find Definition 命令。这是结果列表。
它列出了例如sf::Context,我在项目中使用但不在该标题中。在位于名为Windows Kits 的目录中的文件中的神秘命名空间中也有定义。我既不知道它们的用途,也没有故意将它们包括在内。我不包含除标准库和 JavaScript V8 之外的其他头文件,如上所示。
为什么来自不同命名空间的Contexts 会相互冲突?如何解决此冲突以使用 v8 命名空间?
【问题讨论】:
-
使用命名空间名称。这就是命名空间的用途。
-
我用这条线
using namespace v8;。而且我无法理解名为Context的其他类可能来自哪里。 -
使用命名空间名称作为限定名称的一部分。如您所见,使用声明会导致神秘的冲突。
-
那么
using namespace是什么?它使我的代码更具可读性。但我想这可能会引发一场不适合这里的大讨论。 -
如果您认为它使您的代码更具可读性,请务必使用它。但要为开始讨论的那个神秘错误做好准备。
标签: c++ visual-studio namespaces