Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Как хитро обойти двусмысленность?


Автор: Homskiy 14.6.2008, 04:57
Значит, есть проект (не мой), который надо использовать. Он написан на С. Переписывать есесно впадел, учитывая, что надо из него лишь пару функций. Мой проект пишется на Builder 5, и в итогуе использует VCL и все прибамбасы C++. В не моем проекте есть следующие строчки в хидере:
  
Код

Word   word[MAX_SENTENCE]; 
String * String_create()


на что компилятор матюкается: 
  •  Ambiguity between 'Word' and 'System::Word'
  •  Ambiguity between 'String' and 'System::String'

Пробовал поотключать нафик все параметры в параметрах проекта + поставил флажек на использование С + назначил использование хидеров и либов из Turbo C, эта проблема исщезла (появились другие, но это к теме не относится).
Но такой подход все-таки не подходит. Все прибамбасы в итоговом проекте должны быть и все должно будет компилироваться вместе, так сказать... 

Так вот, можно ли как-то запретить использование неймспейса System локально? Или как-то по другому обойти эту проблему? 

ЗЫ:
Переписывание не моего проэтка - не подходит - слишком дохера переписывать + дополнительно в нем разбираться, а мне надо всего-то пару функций... Так что несоизмеримость затрат и результата... 

Автор: bronislav 14.6.2008, 15:49
А может легче отдельно реализовать эти самые пару функций?

Автор: Homskiy 14.6.2008, 16:09
Нее. Там прога которая делает синтаксический анализ текста. А мне надо собсно функции которые делают этот анализ для предложений, возращают структуру и дают возможность обхода по ней... Самому это не наваять... 

Автор: bronislav 14.6.2008, 20:09
Как я понимаю компилятор ругается на пересечение неймспейсов. Вот так с ходу даже не знаю как это решить  smile

Можно попробывать указывать неймспейс явно. Используя System::Word, там где тебе надо использовать эти типы, а используемую по умолчанию директиву using namespace System - убрать.

Автор: Homskiy 15.6.2008, 03:03
Вот как раз интересно где она убирается... хелпа молчит на эту тему.. Если подскажите где вообще в билдере находится управление директивами (я понимаю, что строчка в файле проекта, "pragma ..." - как бе отвечает за это дело, вроде) то буду очень признателен. 

Автор: bronislav 15.6.2008, 09:12
Дело в том, что я не знаю где это еще можно посмотреть в билдере, кроме как в начале файлов *.cpp *.h

Это вам к специалистам по билдеру в соответсвующий раздел.

p.s. директива pragma не управляет использованием неймспейсов

Автор: fish9370 15.6.2008, 12:51
Цитата(Homskiy @  14.6.2008,  04:57 Найти цитируемый пост)

Word   word[MAX_SENTENCE]; 
String * String_create()


Цитата(Homskiy)

на что компилятор матюкается: 

 Ambiguity between 'Word' and 'System::Word'
 Ambiguity between 'String' and 'System::String'


компилятор ругается на неоднозначность..

сделай так:

Код

::Word   word[MAX_SENTENCE]; 
::String * String_create()

Автор: xvr 16.6.2008, 11:11
Цитата(Homskiy @ 14.6.2008,  04:57)
Значит, есть проект (не мой), который надо использовать. Он написан на С. Переписывать есесно впадел, учитывая, что надо из него лишь пару функций. Мой проект пишется на Builder 5, и в итогуе использует VCL и все прибамбасы C++. В не моем проекте есть следующие строчки в хидере:
  
Код

Word   word[MAX_SENTENCE]; 
String * String_create()


на что компилятор матюкается: 

  •  Ambiguity between 'Word' and 'System::Word'
  •  Ambiguity between 'String' and 'System::String'


Добавь перед #include'ом с этим хидером
Код

#define Word MyWord
#define String MyString

и соответственно
Код

#undef Word
#undef String
 после. Так же не забудь окружить хидер extern "C" { ... } (если его нет в самом хидере)
Отключтить using namespace System; не получится - он зашит в system.hpp, который напрямую включается в vcl.h Можно переставить #include <vcl.h> с твоим инклюдом, но тогда придется отключить предкомпилированные хидеры  smile 

Автор: Homskiy 16.6.2008, 16:04
ну тут уже мне разрулили как это сделать
http://forum.vingrad.ru/forum/topic-216732/unread-1/anchor-entry1550655/0.html

с помощью адаптера

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)