为什么这个名字含糊不清?

时间:2013-03-30 19:16:04

标签: c++ visual-studio namespaces

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

它通常起作用,但由于某些原因,当我没有在每个类名前面指定v8命名空间时,存在名称空间冲突。例如,Visual Studio 2012告诉我,名称Context将是不明确的。但我不明白为什么。

example code from the Getting Started guide

我在此文件中包含的唯一命名空间是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命令,可在上下文菜单中找到。这是结果列表。

definitions of the name Context

它列出了我在项目中使用但未在该标题中使用的示例sf::Context。隐藏名称空间中还有定义位于名为Windows Kits的目录中的文件中的定义。我既不知道它们的用途,也没有故意将它们包括在内。除了标准库和JavaScript V8之外,我不包括其他头文件,如上所示。

为什么来自不同命名空间的Context会相互冲突?如何修复此冲突以使用v8命名空间?

1 个答案:

答案 0 :(得分:1)

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