Двусмислен символ. Трябва да запазите и двете пространства от имена

Чета от 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;

Първоначалната грешка възникна, когато се опитах да използвам String, тъй като той е дефиниран както в System, така и в OVR. Промених кода на System::String, но сега получих грешка, която ми казва, че System е двусмислена, защото вече е дефинирана в OVR::System

Има ли някакъв начин да се избегне този конфликт? Някакъв начин да изключите OVR::String и OVR::System да не бъдат засегнати от клаузата „използване“? Не мога да се отърва от една от клаузите „използване“, защото имам много препратки към членовете на тези пространства от имена в моя код.


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), тогава имате две възможности. Или приемете, че ще трябва да използвате изрични пространства от имена за едно от тях, или създайте typedefs за едно от тях:

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