2013-03-30 2 views
1

В последнее время я решил включить JavaScript V8 Engine в свой проект. После компиляции и привязки к нему я хотел запустить пример из руководства Getting Started.Почему это имя неоднозначно?

Это работает в общем, но по некоторым причинам существуют конфликты пространства имен, когда я не указываю пространство имен v8 перед каждым именем класса. Visual Studio 2012 говорит мне, например, что имя Context было бы неоднозначным. Но я не понимаю, почему.

example code from the Getting Started guide

Единственные пространств имен я включаю в этом файле 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 может быть определен также, я использовал Find Definition команды в Visual Studio, доступной в контекстном меню. Это список результатов.

definitions of the name Context

В нем перечислены, например sf::Context, который я использую в проекте, но не в этом заголовке. Существуют также определения в критических пространствах имен, расположенных в файлах в каталоге с именем Windows Kits. Я не знаю, для чего они предназначены, и я не включил их намеренно. Я не включаю другие файлы заголовков, кроме стандартной библиотеки и JavaScript V8, как показано выше.

Почему числа Context s из разных пространств имен сталкиваются друг с другом? Как исправить эти конфликты, чтобы использовать пространство имен v8?

+0

Используйте имя пространства имен. Для этого нужны пространства имен. –

+0

Я использую эту строку 'using namespace v8;'. И я не могу понять, откуда взялись другие классы под названием «Контекст». – danijar

+0

Используйте имя пространства имен как часть квалифицированного имени. Использование деклараций, как вы видели, приводит к таинственным конфликтам. –

ответ

1

Попробуйте составить код. Компилятор должен отображать фактические конфликтующие символы, возможно, в том числе, где они фактически определены. Вам необходимо либо удалить одно из ваших приложений, либо полностью квалифицировать идентификатор.

+0

Эй, просто компиляция кода решила всю проблему. Похоже, что это была ошибка в методе IntelliSense, которая утверждает, что выделяет синтаксические ошибки в Visual Studios во время ввода. Подсказки чтения все еще отображаются, но скомпилированы без предупреждений и ошибок. – danijar

+0

Да, обработка C++ действительно сложна, поэтому для того, чтобы быть достаточно быстрой, чтобы быть полезной, требуется несколько ярлыков, которые могут иногда приводить к тому, что происходит от синхронизации с реальностью. –

Смежные вопросы