Неоднозначный символ. Необходимо сохранить оба пространства имен

Я читаю с Oculus Rift и пишу через последовательный порт для управления Arduino, но у меня проблемы с пространствами имен, так как я новичок в C++.

Начало моего кода выглядит так:

#using <System.dll>

#include "OVR.h"
#include <iostream>
#include <conio.h>

using namespace System;
using namespace System::IO::Ports;
using namespace System::Threading;
using namespace OVR;

Исходная ошибка возникла, когда я попытался использовать строку, поскольку она определена как в системе, так и в OVR. Я изменил код на System::String, но теперь я получил сообщение об ошибке, говорящее мне, что System неоднозначна, потому что она уже определена в OVR::System.

Есть ли способ избежать этого конфликта? Какой-то способ исключить OVR::String и OVR::System из-под влияния предложения «using»? Я не могу избавиться от одного из предложений «using», потому что в моем коде много ссылок на членов этих пространств имен.


person user3621305    schedule 09.05.2014    source источник


Ответы (2)


Во-первых, вы всегда можете полностью уточнить имя, чтобы использовать его конкретно:

::System::String^ string; // this will always work

Вы также можете использовать специальные директивы using для устранения неоднозначности без необходимости полного уточнения имен:

using ::System::String;
String^ string;

Using директивы могут быть размещены на любом уровне и будут влиять только на этот уровень. Например, если вы поместите один на глобальном уровне, он повлияет на весь ваш файл. Если вы поместите его внутрь функции, это повлияет только на вашу функцию.

Кроме того, я не знаю, понимаете ли вы это, но вы используете C++CLI, расширение C++, позволяющее использовать классы .NET с кодом, подобным C++. Это работает только на платформах Microsoft.

person zneak    schedule 09.05.2014

Пространство имен OVR включает в себя множество вещей, которые имеют общие имена и могут конфликтовать с тем, что вы используете, поэтому не импортируйте его. Другими словами, не делайте этого:

using namespace OVR;

Вместо этого импортируйте определенные элементы OVR, которые вы хотите, следующим образом:

using OVR::Matrix4f;

Теперь вы можете использовать класс Matrix4f без прикрас в своем коде, не беспокоясь о конфликтующих типах, которые вы не импортировали.

Если все еще есть проблема, из-за которой у вас возникнет конфликт (скажем, вам нужно использовать класс OVR Matrix4f и ваш собственный класс Matrix4f), у вас есть два варианта. Либо примите, что вам придется использовать явные пространства имен для одного из них, либо создайте определения типов для одного из них:

typedef OVR::Matrix4f OVRMat4;
Matrix4f foo;
OVRMat4 foo;
person Jherico    schedule 13.05.2014