【问题标题】:Why is this name ambiguous?为什么这个名字有歧义?
【发布时间】:2013-03-21 06:54:12
【问题描述】:

我最近决定在我的项目中加入 JavaScript V8 引擎。编译并链接到它之后,我想运行 Getting Started 指南中的示例。

它通常可以工作,但是由于某些原因,当我没有在每个类名前面指定 v8 命名空间时,会出现命名空间冲突。例如,Visual Studio 2012 告诉我,名称 Context 会模棱两可。但我不明白为什么。

我在这个文件中包含的唯一命名空间是stdv8。它是一个头文件,在你问之前,它应该是这样的,因为它声称是一个只有头文件的库。

#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


【解决方案1】:

尝试实际编译代码。编译器应该列出实际冲突的符号,可能包括它们实际定义的位置。您将需要删除您的一个 usings 或完全限定标识符。

【讨论】:

  • 嘿,只需编译代码就解决了整个问题。这似乎是 IntelliSense 技术中的一个错误,声称在键入过程中突出显示 Visual Studios 中的语法错误。读取的下划线仍然显示,但编译时没有警告和错误。
  • 是的,处理 C++ 真的很复杂,所以为了足够快地发挥作用,它需要一些捷径,这有时会导致事情与现实不同步。
猜你喜欢
  • 2011-02-09
  • 2014-11-15
  • 2015-10-06
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
相关资源
最近更新 更多