Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странная ошибка - добавил StatusBar в форму, Программа посыпалась... 
V
    Опции темы
new_web
Дата 7.2.2008, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 1.2.2008

Репутация: нет
Всего: нет



Делал программу,  которую опысывал в теме 
Первая программа для людей, Как облагородить своё творение?

добавил StatusBar и смотрите, что сказал компилятор (до этогог програма давно, исправно работала) :
Цитата

Build
  [C++ Error] ComCtrls.hpp(2638): E2015 Ambiguity between 'Windows' and 'Word_2k::Windows'
  [C++ Error] ComCtrls.hpp(2839): E2015 Ambiguity between 'Windows' and 'Word_2k::Windows'
  [C++ Error] ComCtrls.hpp(4140): E2015 Ambiguity between 'Windows' and 'Word_2k::Windows'
  [C++ Error] ComCtrls.hpp(4259): E2015 Ambiguity between 'Windows' and 'Word_2k::Windows'
  [C++ Error] ComCtrls.hpp(4429): E2015 Ambiguity between 'Windows' and 'Word_2k::Windows'
  [C++ Error] Unit1.cpp(88): E2015 Ambiguity between '_fastcall System::operator +(double,const System::Variant &)' and '_fastcall System::operator +(double,const System::Currency &)'
  [C++ Error] Unit1.cpp(118): E2015 Ambiguity between '_fastcall System::operator /(double,const System::Variant &)' and '_fastcall System::operator /(double,const System::Currency &)'



Это целых 7 ошибок!
Удаляю StatusBar - эти ошибки не исчезают. Приходится загружать по-новому проект ,с того места. где он был сохранён. Я не понимаю, что значат эти сообщения, и почему моё безневинное действие - я только добавил, привело копмилятор в такую неопределёееость - в итоге 7 ошибок.
Интересно. что когда ставлю на путую форму, то проблемы не возникает


PM MAIL   Вверх
mr.Anderson
Дата 7.2.2008, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 1
Всего: 128



Цитата
Интересно. что когда ставлю на путую форму, то проблемы не возникает

А это говорит лишь о том, что виноват твой собственный код.

Очень вероятно, что у тебя где-то в коде есть функция Windows, или класс Windows, что конфликтует с соответствующим объектом из указанного компилятором файла. То же самое с перегруженными операторами. Проверь этот факт.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
soroka
Дата 9.2.2008, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 9.2.2008

Репутация: нет
Всего: нет



У меня тоже бывали такие случаи при использовании операторов, подскажите. как правильно их использовать операторы, или лучше тогда стараться их вообще не использовать?
PM MAIL   Вверх
new_web
Дата 9.2.2008, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 1.2.2008

Репутация: нет
Всего: нет



Спасибо, я понял! Наверное, лучше всего переделать программу, не используя операторов, ибо, если честно, я не совсем понимаю как их правильно использовать... недоучился ещё - просто, попробовал - оно заработало, считало правильно. значит хорошо....

PM MAIL   Вверх
new_web
Дата 12.2.2008, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 1.2.2008

Репутация: нет
Всего: нет



Ошибка возникла из-за некоректного удаления компонентов из формы - правду пишут учебники -
НИКОГДА НЕ УДАЛЯЙТЕ КОДА, СОЗДАННОГО АВТОМАТИЧЕСКИ
если не знаеете. что вы делаете.
Я тогда думал, что знал.
Пробовал методом научного тыка, какой компонент чё делает, подходит, не подходит, а удалял...
по разному,  и  из .h файла вручную...был такой грех.
Остались лишние #include - они и потом взорвались.
Удалил лишние #include -на этом всё - вопрос решён!
PM MAIL   Вверх
bsa
Дата 13.2.2008, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Для тех, кто не понимает что это за ошибки:
Цитата
E2015 Ambiguity between '_fastcall System::operator +(double,const System::Variant &)' and '_fastcall System::operator +(double,const System::Currency &)'
Есть два оператора:
Код
_fastcall System::operator +(double,const System::Variant &)
_fastcall System::operator +(double,const System::Currency &)
Видно, что они отличаются вторым параметром. Допустим, есть некий класс X:
Код
class X
{
      ....
public:
      ....
      operator System::Currency() const; //оператор преобразования объектов класса X к типу System::Currency
      operator System::Variant() const; //оператор преобразования объектов класса X к типу System::Variant
};
А теперь в каком-то месте мы делаем:
Код
X x;
y = 0.9 + x; //в этой строке произойдет ошибка компиляции
Компилятор просто не может понять, а какой именно из операторов использовать, так как можно использовать оба. Чтобы избавиться от ошибки, нужно явно указать тип:
Код
X x;
y = 0.9 + static_cast<System::Variant>(x);

PM   Вверх
new_web
Дата 13.2.2008, 02:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 1.2.2008

Репутация: нет
Всего: нет



Ого! Спасибо теперь буду знать, ибо тогда я так и не понял,  чём речь,  удалив лишнее я добился правильной компиляции.
Из выше приведённого кода я понял. что этим перегружается оператор  "+" для его применения к неким объектам классов, только. не совсем понимаю ещё, для чего это нужно. и как оно будет работать
Код


        X x;
y = 0.9 + static_cast<System::Variant>(x);

Что принимает переменная у?
PM MAIL   Вверх
bsa
Дата 13.2.2008, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(new_web @ 13.2.2008,  02:29)
Что принимает переменная у?

Зависит от того, что за переменная y и что возвращает используемый operator+().
В данном контексте это неважно.
PM   Вверх
new_web
Дата 13.2.2008, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 1.2.2008

Репутация: нет
Всего: нет




Цитата(bsa @  13.2.2008,  16:38 Найти цитируемый пост)
Зависит от того, что за переменная y и что возвращает используемый operator+().В данном контексте это неважно.


Самое обидное в моём случае это то. что я так и не добрался до этого места, где случилась ошибка, проблема устранилась как-бы сама-собой(см. выше)...

Из моей колокольни мне кажется что у переменной "у" должен быть тип сопоставимый с типом слагаемой переменной...наверное?...

В будущем. когда я научусь понимать смысл
Код

_fastcall System::operator +(double,const System::Variant &)
_fastcall System::operator +(double,const System::Currency &)


Я постараюсь помнить и недопустить подобной ошибки, спасибо!

PM MAIL   Вверх
bsa
Дата 13.2.2008, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



__fastcall - это способ вызова (кажется, порядок расположения аргументов функции в стеке при ее вызове)
System - это пространство имен (namespace System)
operator+ - это такое встроенное имя функции (можно прям так и писать: y = System::operator+(x, z); )
double - встроенный вещественный тип
const - атрибут константности
Variant&/Currency& - ссылки на объекты соответствующих классов, объявленных в пространстве имен System.

Что еще непонятно?
PM   Вверх
new_web
Дата 13.2.2008, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 1.2.2008

Репутация: нет
Всего: нет



Цитата(bsa @  13.2.2008,  23:46 Найти цитируемый пост)
Что еще непонятно?

 smile Хочу пример smile 
Где конкретно, и для чего применяются такие програмные конструкции?

PM MAIL   Вверх
bsa
Дата 14.2.2008, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



System::Variant - это тип, позволяющий хранить любой стандартный тип данных (строка, int, char, double...):
Код
System::Variant __fastcall System::operator+(double a, const System::Variant &b) {
    return System::Variant( a + static_cast<double>(b));
}
...

System::Variant a, b;
...
a = 0.5 + b; // хотя, можно написать так: a = System::operator+(0.5, b);

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0497 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.